我的问题如下:
我有一个等待条件变量的线程。我需要破坏这个线程。看起来很简单:
~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?
}
};
答案 0 :(得分:2)
假设我们从主线程调用~myclass
(称之为线程A),您可以检查是否需要在从属线程中停止它(称之为线程B):
我们有一个名为Atomic<bool>
的{{1}}变量,可从两个主题访问。
在主题A:
中Stop
在主题B中:
~myclass()
{
Stop = true;
myConditionVariable.notifyAll();
myThread.join();
}