繁体   English   中英

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

[英]Is it OK to check if (this == NULL) in C++ in order to terminate a detached thread's execution?

可以说我创建了一个类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();
    }
};

在线程仍在运行时删除X对象绝对是行不通的; 由于仍在运行的线程试图访问现在释放的数据,因此您最终将导致大量崩溃和数据损坏。

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

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

join()返回后,就可以安全地删除X对象了。

(注意:如果您在X类的析构函数中执行上述步骤,则只有从不继承X子类,或者(如果您是X的子类)该线程才永不访问子类中的任何数据成员(例如,如果线程从不调用任何虚拟方法),这是因为在子类析构函数被调用(内部线程仍在运行)与X析构函数被调用(以停止线程)之间存在竞争状态。线程可以从子类的层访问现在释放的数据)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM