多线程程序,捕获信号的条件变量破坏

时间:2015-06-03 12:29:20

标签: c++ multithreading condition-variable

以下是我的多线程程序。

#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的数据成员?这种方法有多安全?有没有更好的方法呢?

2 个答案:

答案 0 :(得分:0)

而不是退出(blah)通常不赞成,为什么不放入原子标志,并使线程在设置时停止循环?然后在你的信号处理程序中设置标志,线程自行停止,主要连接两者,程序正常终止所有析构函数等等?

答案 1 :(得分:0)

1 - 一旦产生线程就退出main。你应该保持循环或等待线程重新加入。

2 - 在事件处理程序中,只需设置一个布尔标志来告诉线程退出

3 - 您的线程应该查看该变量并在其变为真时退出

如果变量只是一个布尔标志,那么您不需要互斥锁来保护它免受并发访问