C ++线程程序没有终止

时间:2014-08-28 13:36:33

标签: c++ multithreading pointers

我不知道为什么我的代码没有终止。 这可能是我想念的一些显而易见的事情,请帮忙!

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;
}

1 个答案:

答案 0 :(得分:10)

线程正在获得m的副本,而不是对它的引用。使用引用包装器为其提供引用:

thread t1(th,std::ref(m));

程序可能按预期结束;但是由于在一个线程上修改m并在没有同步的情况下在另一个线程上读取它的数据争用,您仍然有未定义的行为。要解决此问题,请使用std::atomic<MyClass*>,或使用互斥锁保护两次访问。