是否可以在C++中检查(this == NULL)以终止分离线程的执行?

cod*_*ark 0 c++ multithreading destructor this thread-safety

假设我创建了一个类X的对象.当构造类X时,它会在一个无限循环的函数上创建一个分离的线程.当类X被销毁时,我想终止(或打破)这个分离的线程.这可能吗?有没有更好的方法来实现这一目标?

例如:

class X
{
public:
    X(){
        startThread();
    }
    virtual ~X(){

    }

    void myThread()
    {
        cout << "start of myThread()" << endl;

        int loop = 0;
        while(true)
        {
            //std::this_thread::sleep_for(std::chrono::seconds(5));
            ++loop;
            cout << "loop # " << loop << endl;
            if(this == NULL){
                break;
            }
        }

        cout << "end of myThread()" << endl;
    }

    void startThread()
    {
        std::thread example(&X::myThread, this);
        example.detach();
    }
};
Run Code Online (Sandbox Code Playgroud)

Jer*_*ner 6

在线程仍在运行时删除X对象肯定不起作用; 你将最终崩溃和破坏数据,因为仍在运行的线程试图访问现在释放的数据.

你的主线程(即产生myThread线程的线程)需要做的是:

  1. 以某种方式告诉线程自愿停止循环并退出(例如通过更改myThread定期检查的std :: atomic <bool>的值,或者在myThread正在接收的套接字上发送一个字节,或类似的东西)
  2. 在线程对象上调用join().join()将阻塞,直到线程完全退出.

一旦join()返回,您就可以安全地继续删除X对象.

(旁注:如果你在X类的析构函数中执行上述步骤,只要你从不子类化X,或者(如果你做X子类),线程就永远不会访问子类中的任何数据成员(例如,如果线程从不调用任何虚方法).这是因为在子类析构函数被调用(内部线程仍在运行)和X析构函数被调用(停止线程)之间会有一个竞争条件线程可以从子类的层访问现在释放的数据)