c++ 如何在类中创建一个单独的线程?

gkn4icbw  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(176)

我有一个类foo,我在一个成员函数中放入了一个线程对象,我尝试在另一个函数中像这样初始化它,我的问题是,我得到了相同的thread::get_id,但有一个不同的函数foo::mycount,我需要计数一些东西,myprintmycount都使用this_thread::sleep_for,但它们没有单独休眠(我希望发生的事情)。我会用一些代码示例来跟进

class foo
{
  void func()
  {
    std::thread mythread(&foo::myprint, this);
    mythread.join();
  }
  void myprint()
  {
    sleep_for(1s);
    cout << count << endl;
  }
  void mycount()
  {
    sleep_for(1ms);
    count++;
    cout << count << endl;
  }
};
void main()
{
  foo obj;
  while(1)
 {
   obj.func();
   obj.mycount();
 }
}

我也试过把mycount放到另一个函数中,但是std::call_once没有影响到任何东西,因为我在mycount函数中使用了它,我希望不同的函数使用不同的get_id

xxhby3vn

xxhby3vn1#

下面是一个使用lambda函数启动异步进程的例子,使用std::future来同步类的析构函数和后台线程(在这个例子中是计数)。

#include <iostream>
#include <future>
#include <thread>
#include <chrono>

// dont do "using namespace std"

using namespace std::chrono_literals;

class foo
{
public:

    foo() = default;

    ~foo()
    {
        // destructor of m_future will synchronize destruction with execution of the thread (waits for it to finish)
    }

    void func()
    {
        m_future = std::async(std::launch::async, [=] { myprint(); });
    }

    void myprint()
    {
        for (std::size_t n = 0; n < 5; ++n)
        {
            std::this_thread::sleep_for(1s);
            std::cout << n << " ";
        }
        std::cout << "\n";
    }

private:
    std::future<void> m_future;
};

int main()
{
    foo obj;

    obj.func(); // start thread

    return 0;
}

相关问题