私のC++ 11プロジェクトでは、無限に動作する2つのスレッドを生成する必要があります。ここに例があります:
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
のために何かをする必要があると思う、それはプログラムを殺すために使用される。しかし、私はこのプログラムを適切にやめる方法を知らない。私が正しい場合main
は、だから私は、私は彼らがこのように切り離すにする必要があると思う0を返した場合でも、
、t1
とt2
は実行を続ける場合があります:
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'は普通の' bool'の代わりに '' std :: atomic''(http://en.cppreference.com/w/cpp/atomic/atomic)でなければなりません。スレッドを切り離すと、結合できなくなります。 –
そして、あなたの心配を軽減するために:スレッドが終了していないスレッドの場合、スレッドが本当に終了するまで、 'join'関数は戻りません。つまり、両方のスレッドが終了していない限り、 'main'関数は終了しません(プロセスが終了します)。 –
この種の問題の一般的な規則はスレッドサニタイザを使用することです。あなたはそれをやりました? – NoSenseEtAl