在等待中使用条件变量破坏类

时间:2015-05-12 14:21:14

标签: c++ multithreading c++11 race-condition

我的问题如下:

我有一个等待条件变量的线程。我需要破坏这个线程。看起来很简单:

~myclass()
{
    myConditionVariable.notifyAll();
    myThread.join();
}

然而,这样做的问题是运行析构函数的线程可能会停止,允许对条件变量进行新的等待调用。

除此之外,我还有一个成员函数,对其中的条件变量进行了等待调用。说:

myMemberFunction()
{
    myConditionVariable.wait(myLock);
}

这可以在许多线程上从外部调用。如何在实际销毁之前确保所有这些调用都已完成。

修改

对于completity样本类:

Myclass()
{
public:
    std::mutex waitMutex;

    std::condition_variable waitConditionVariable;

    //n.b. this function can be called from multiple threads;
    void wait()
    {
        std::condition_variable(wait);
    }

    ~MyClass()
    {
         //what should i do here?
    }

};

1 个答案:

答案 0 :(得分:2)

假设我们从主线程调用~myclass(称之为线程A),您可以检查是否需要在从属线程中停止它(称之为线程B):

我们有一个名为Atomic<bool>的{​​{1}}变量,可从两个主题访问。

在主题A:

Stop

在主题B中:

~myclass()
{
    Stop = true;   
    myConditionVariable.notifyAll();
    myThread.join();
}