在我的c + + 11项目中,我需要生成两个无限运行的线程。这里有一个例子:
C++:如何正确退出多线程程序
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
,我得到一个错误:
terminate called after throwing an instance of 'std::system_error'
我发现this link,所以我想亲blem是相同的:mtx
和/或cond
已被销毁,而t1
或t2
尚未完成。
那么我该如何正确杀死程序呢?或者我不需要处理信号ctrl-c
,程序本身知道如何正确退出?
没有看起来差不多吧。除了'done'可能应该是['std :: atomic'](http://en.cppreference.com/w/cpp/atomic/atomic)而不是简单的'bool'。如果您分离线程,则无法连接。 –
并减轻您的后顾之忧:对于未绑定的线程,只有线程真正结束时,“join”函数才会返回。这意味着你的'main'函数不会结束(并且进程退出),除非两个线程都退出了。 –
这种问题的一般规则是使用线程消毒剂。是你做的吗? – NoSenseEtAl