0
我在閱讀「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函數完成時該對象超出了範圍,但我無法理解如何避免作者提到它。
那麼,不要使用參考。使函數參數爲'int i_',而不是按照值複製。查看C++ 11 lambda表達式以使代碼更現代。 –