c++ - 如何使线程函数自包含

标签 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();
}

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

我明白这个问题是因为创建的函数对象是 oop 函数的本地对象,当 oops 函数完成时对象超出范围,但我不明白如何按照作者提到的方式避免。

最佳答案

问题不在于 func 对象。 std::thread 将复制您的仿函数。

First the constructor copies/moves all arguments (both the function object f and all args...) to thread-accessible storage

问题是引用 int& i; 您的仿函数保留在 some_local_state 中,一旦 some_local_state 超出范围,它确实无效。

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

关于c++ - 如何使线程函数自包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37236823/

相关文章:

c++ - C++ 中不可预测的输出

java - 没有打印语句,循环看不到其他线程更改的值

c++ - 如何在 QMainWindow 的默认布局中排列项目?

c++ - 重载函数不编译的简单 SFINAE 示例

c - 为什么每次调用 pthread_join() 时 pthread_join() 的返回值都没有改变

multithreading - Qt - 关闭被系统级调用阻塞的QThreads

java - DelayQueue中的leader到底是做什么用的?

java - AsyncTask "onPostExecute"永远不会被调用

C++11 std::thread 和虚函数绑定(bind)

C++ 头文件返回对类型