私は非常に単純なスレッドアプリケーションを作成しようとしていますが、boostのスレッドライブラリには新しくありません。私が働いている簡単なテストプログラムは、次のとおりです。(simple)boost thread_group question
#include <iostream>
#include <boost/thread.hpp>
int result = 0;
boost::mutex result_mutex;
boost::thread_group g;
void threaded_function(int i)
{
for(; i < 100000; ++i) {}
{
boost::mutex::scoped_lock lock(result_mutex);
result += i;
}
}
int main(int argc, char* argv[])
{
using namespace std;
// launch three threads
boost::thread t1(threaded_function, 10);
boost::thread t2(threaded_function, 10);
boost::thread t3(threaded_function, 10);
g.add_thread(&t1);
g.add_thread(&t2);
g.add_thread(&t3);
// wait for them
g.join_all();
cout << result << endl;
return 0;
}
しかし、私はコンパイルして、私は明らかに
$ ./test
300000
test: pthread_mutex_lock.c:87: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
Aborted
の出力を取得し、このプログラムを実行すると、結果は正しいですが、私は心配しています本質的に同じ構造を持つ実際のプログラムがjoin_all()ポイントでスタックしているため、このエラーメッセージについて誰かが私に何が起こっているか説明することができますか?これを行うためのより良い方法がありますか?つまり、いくつかのスレッドを起動し、それらを外部コンテナに格納してから、プログラムを続行する前にすべてのスレッドが完了するのを待ちますか?
ありがとうございました。
「新しい」メモリ割り当ての省略記号を削除し、thread_groupに渡す必要があります。そうでなければ、途中で何かがうまくいかない(つまりスローする)と、スレッドがリークします。 –
はい、これはそのように思われ、大きなプログラムでもバグの原因となっていました。作業の例では、今使用しています: //は、3つのスレッド g.add_thread(新しいブースト::スレッド(threaded_function、10))を起動します。 g.add_thread(新しいboost :: thread(threaded_function、10)); g.add_thread(新しいboost :: thread(threaded_function、10)); – RandomGuy
あなたがリークしないようにするには、std :: unique_ptrまたは類似のソリューションを使用し、ptr.get()を使用してgroup_threadにスレッドを提供するのが良いでしょう。 –
Klaim