如何使 Thread 函数自包含

Aja*_*jay 0 c++ multithreading

我正在阅读《C++ 并发实践》。我对下面的代码片段有以下疑问。

struct func
{
   int& i;
   func(int& i_):i(i_){}
   void operator()()
   {
       for(unsigned j=0;j<1000000;++j)
       {
           do_something(i); //Can have issue of dangling references
       }
   }
};

void oops()
{
    int some_local_state=0;
    func my_func(some_local_state);
    std::thread my_thread(my_func); 
    my_thread.detach();
}
Run Code Online (Sandbox Code Playgroud)

作者说,为了避免这种情况,一种方法是 使线程函数自包含,并将数据复制到线程中,而不是共享数据

我确实理解这个问题是因为创建的函数对象是 oop 函数的本地函数,并且当 oops 函数完成时该对象超出范围,但我无法理解如何以作者提到的方式避免它。

Seb*_*ann 5

问题不是func对象。std::thread将复制你的函子。

首先,构造函数将所有参数(函数对象 f 和所有参数...)复制/移动到线程可访问的存储中

问题是int& i;函子保留的引用some_local_state一旦some_local_state超出范围就会无效。

为了解决这个问题,复制 的值some_local_state而不是保留对它的引用。如果您需要共享访问,请考虑使用std::shared_ptr.