c ++:如何正确退出多线程程序

时间:2017-08-31 08:53:32

标签: multithreading c++11 thread-safety signals

在我的c ++ 11项目中,我需要生成两个无限运行的线程。这是一个例子:

static vector<int> vec;
static std::mutex mtx;
static std::condition_variable cond;
static bool done = false;
void f1()
{
    while(!done)
    {
        // do something with vec and mtx
    }
}

void f2()
{
    while(!done)
    {
        // do something with vec and mtx
    }
}

thread t1(f1);
thread t2(f2);

void finish(int s)
{
    done = true;
    // what should I do???
}

int main()
{    
    signal(SIGINT, finish);
    t1.join();
    t2.join();
    return 0;
}

通常情况下,我不会停止或杀死此程序。但是在异常的情况下,我认为我需要为ctrl-c做一些事情,用于杀死程序。但我不知道如何正确退出这个程序。

如果我是对的,t1t2可能会继续执行,即使main已返回0.所以我认为我需要让它们像这样分离:

void finish()
{
    done = true;
    t1.detach();
    t2.detach();
}

然而,当我执行程序并执行ctrl-c时,我收到错误:

  

在抛出'std :: system_error'

的实例后终止调用

我找到this link,所以我认为问题是相同的:mtx和/或condt1t2时被销毁尚未结束。

那么我怎么能正确地杀死程序呢?或者我不需要处理信号ctrl-c,程序本身知道如何正确退出?

1 个答案:

答案 0 :(得分:1)

done应为std::atomic<bool>,否则未经检测的读/写不合法。

只有std::atomic<bool>::is_lock_free为真,才能在信号处理程序中访问原子变量。检查一下。如果不是这样,那么您的程序可能会因main中的错误而中止。

当你.join()时,你等待线程完成执行。除非线程已经完成,否则你不想退出main

简而言之,请执行以下操作:

static std::atomic<bool> done = false;

(其余代码在这里)

int main()
{    
  if (!done.is_lock_free()) return 10; // error
  signal(SIGINT, finish);
  t1.join();
  t2.join();
}