以下是我的多线程程序。
#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();
}
Context类如下
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();
}
};
由于thread1连续运行,因此控件永远不会达到thread2可以连接到主线程的程度。
因此印刷品是
Joining Thread1
现在,抛出信号SIGINT。当在signalHandler中调用exit(signum)时,我收到以下错误
boost::condition_variable::~condition_variable(): Assertion `!pthread_mutex_destroy(&internal_mutex)' failed
Segmentation Fault
这是因为thread2还没有加入主线程吗?如果是,有没有办法可以在signalHandler中显式停止thread2?我是否必须使该线程成为Context的数据成员?这种方法有多安全?有没有更好的方法呢?
答案 0 :(得分:0)
而不是退出(blah)通常不赞成,为什么不放入原子标志,并使线程在设置时停止循环?然后在你的信号处理程序中设置标志,线程自行停止,主要连接两者,程序正常终止所有析构函数等等?
答案 1 :(得分:0)
1 - 一旦产生线程就退出main。你应该保持循环或等待线程重新加入。
2 - 在事件处理程序中,只需设置一个布尔标志来告诉线程退出
3 - 您的线程应该查看该变量并在其变为真时退出
如果变量只是一个布尔标志,那么您不需要互斥锁来保护它免受并发访问