在我的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
做一些事情,用于杀死程序。但我不知道如何正确退出这个程序。
如果我是对的,t1
和t2
可能会继续执行,即使main
已返回0.所以我认为我需要让它们像这样分离:
void finish()
{
done = true;
t1.detach();
t2.detach();
}
然而,当我执行程序并执行ctrl-c
时,我收到错误:
在抛出'std :: system_error'
的实例后终止调用
我找到this link,所以我认为问题是相同的:mtx
和/或cond
在t1
或t2
时被销毁尚未结束。
那么我怎么能正确地杀死程序呢?或者我不需要处理信号ctrl-c
,程序本身知道如何正确退出?
答案 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();
}