我不知道为什么我的代码没有终止。 这可能是我在这里遗漏的一些明显的事情,请帮忙!
using namespace std;
int main(int argc, char* argv[])
{
MyClass *m = new MyClass();
thread t1(th,m);
delete m;
m=NULL;
t1.join();
return 0;
}
void th(MyClass *&p)
{
while(p!=NULL)
{
cout << "tick" << endl;
this_thread::sleep_for(chrono::seconds(1));
}
return;
}
最佳答案
线程正在获得 m
的拷贝,而不是对其的引用。使用引用包装器为其提供引用:
thread t1(th,std::ref(m));
程序将可能如期结束;但由于修改 m
的数据竞争,您仍然有未定义的行为在一个线程上,并在没有同步的情况下在另一个线程上读取它。要解决此问题,请使用 std::atomic<MyClass*>
,或使用互斥体保护这两种访问。
关于C++线程程序不会终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25550187/