クラス Test に 4 つの関数があります。
void Test::A()
{
boost::lock_guard<boost::mutex> lock(mutex);
cout << "A!" << endl;
}
void Test::B()
{
boost::lock_guard<boost::mutex> lock(mutex);
cout << "B!" << endl;
}
void Test::C()
{
boost::lock_guard<boost::mutex> lock(mutex);
cout << "C!" << endl;
}
void Test::D()
{
boost::lock_guard<boost::mutex> lock(mutex);
cout << "D!" << endl;
}
アルファベット順に呼び出しTest::A
てTest::D
、ループ内で何度も呼び出し、boost thread_pool にバインドすると、ほとんどの場合、正常に動作します。ただし、場合によっては、cout ステートメントが順不同で出力されることがあります。したがって、 ABCDABCDABCDAB が表示される場合がありますD C
。私が理解していることから、それは thread_pool が新しいスレッドを取得したときに関係しているだけであり、呼び出される順序を制御することはできません.
私の問題は、C() と D() を順番に呼び出す必要があり (呼び出す必要がある場合)、A() と B() の相対的な順序や C() と C() を気にしないことです。 D()。そのため、thread_pool を介して C と D を呼び出す代わりに、メイン プロセスを介して呼び出し、すべてのミューテックスを保持しています。ループ内のすべての関数を再度呼び出そうとすると、C の cout ステートメントの直前でプログラムがハングします。なぜそうなのか、私は困惑しています。メイン プロセスとそのスレッド全体でミューテックスを使用できませんか?
これらの関数の単純化された性質にもかかわらず、これらの関数は最終的にイベント ベースの関数にアップグレードされるため、C と D のロジックを組み合わせることができません。それらを何度も呼び出すループは、実際のイベントをシミュレートするための単なるダミー ループです。D は常に C の後に呼び出されますが、呼び出される場合と呼び出されない場合があります。
例えば:
あいうえお
ABCCD
広告
ABCCC