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 函数完成时该对象超出范围,但我无法理解如何以作者提到的方式避免它。
问题不是func对象。std::thread将复制你的函子。
首先,构造函数将所有参数(函数对象 f 和所有参数...)复制/移动到线程可访问的存储中
问题是int& i;函子保留的引用some_local_state一旦some_local_state超出范围就会无效。
为了解决这个问题,复制 的值some_local_state而不是保留对它的引用。如果您需要共享访问,请考虑使用std::shared_ptr.
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |