我正在阅读“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/