C++线程程序不会终止

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

最佳答案

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

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

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

关于C++线程程序不会终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25550187/

相关文章:

c++ - 声明没有指针的默认参数循环引用?

c# - 在 .NET 中使用 Interlocked 类进行多线程处理的正确方法

c - 需要更多这方面的信息!中止(核心转储)

java - Java 内存模型是否允许对许多原子/ volatile 变量的非同步访问进行重新排序?

c++ - 如何在 C++ 中将 "string*"转换为 "const string&"?

c - 如何分配结构变量的内存

c++ - 从 C++ 运行一些命令行命令

C++17:在编译时将类型映射到整数值

c++ - 使用 free 时内存使用量没有减少?

swift - 如何在 Swift 中逐点画线