以下是我的多線程程序。多線程程序,捕獲信號條件變量破壞
#include<csignal>
#include<iostream>
#include<string>
void signalHandler(int signum)
{
std::cout<<"SigNum"<<signum;
exit(signum);
}
int main()
{
signal(SIGABRT, signalHandler);
signal(SIGINT, signalHandler);
signal(SIGSEGV, signalHandler);
Context context;
context.launch();
}
上下文類是如下
class Context
{
private:
boost::condition_variable _conditionVariable;
public:
void launchThread1()
{
std::cout<<"Launch Thread1";
/** Continuously and Asynchronously read data from the socket **/
/** Act on the data, conditionVariable is involved **/
}
void launchThread2()
{
std::cout<<"Launch Thread2";
/** Continuously and Asynchronously read data from the socket **/
/** Act on the data, conditionVariable is involved **/
}
void launch()
{
boost::thread thread1(boost::bind(&Context::launchThread1,this));
boost::thread thread2(boost::bind(&Context::launchThread2,this));
std::cout<<"Joining Thread1"<<std::endl;
thread1.join();
std::cout<<"Joining Thread2"<<std::endl;
thread2.join();
}
};
由於線程1連續運行,因此控制從未達到其中線程2可以連接到主線程的點。
因此印刷品是
Joining Thread1
現在,一個信號SIGINT被拋出。當退出(正負號)被稱爲signalHandler,我得到以下錯誤
boost::condition_variable::~condition_variable(): Assertion `!pthread_mutex_destroy(&internal_mutex)' failed
Segmentation Fault
這是因爲線程2還沒有被加入到主線程?如果是,是否有一種方法可以明確停止signalHandler中的thread2?我必須讓線程成爲Context的數據成員嗎?這種方法有多安全?有沒有更好的方法來做到這一點?
有沒有像我可以使用的thread1.stop()函數? –
我們都同時給出了相同的答案,但我認爲你的觀點1是錯誤的 - 他確實在等待加入。另外,爲了「好」,我更喜歡std :: atomic,儘管你可能是正確的,它無論如何都會起作用。 –
你只需要退出函數來「停止」線程 –