私はC++でマルチスレッドに関する質問があります。私は次のようなシナリオを持っています。スレッドをポーリングなしで待機させるにはどうすればよいですか?
void ThreadedRead(int32_t thread_num, BinReader reader) {
while (!reader.endOfData) {
thread_buckets[thread_num].clear();
thread_buckets[thread_num] = reader.readnextbatch()
thread_flags[thread_num] = THREAD_WAITING;
while (thread_flags[thread_num] != THREAD_RUNNING) {
// wait until awakened
if (thread_flags[thread_num] != THREAD_RUNNING) {
//go back to sleep
}
}
}
thread_flags[thread_num] = THREAD_FINISHED;
}
上記のコードのセクションには、スレッド間で共有されるメモリの書き込みまたはアクセスはありません。各スレッドには、thread_numと、データの読み取りに使用できる固有の読み取りオブジェクトが割り当てられます。
メインスレッドは、スレッド状態をTHREAD_WAITING状態にしてスレッド状態をTHREAD_RUNNINGに戻したことを通知し、何らかの作業を行う必要があります。私は彼が彼の状態をポーリングし続けることを望んでいません。
私は条件付きヴァルとミューテックスが私を助けることができることを理解しています。しかし、私はロックを取得したい、またはロックを必要としないので、それらを使用する方法がわかりません。 mainthreadブランケットは、待機中のすべてのスレッドに、現在、より多くのデータを読み込むことが自由であることをどのように通知できますか?
EDIT:誰もが詳細
1を必要とする 念のために)読者は、いくつかのファイル 2を読み込む)thread_buckets uint16の 3)threadflagsのベクトルのベクトルがintベクトル
です彼らはすべて持っています適切にサイズが変更されました
cv.waitを呼び出すときにそうでない場合は、データの競合が発生する可能性があるため、ロックが(CVのために必要とされます)またはcv.notify()。 –
共有された方法でデータがアクセスされていませんか?すべてのスレッドには、それが操作する独自のデータメンバーがあります。私はそれらを相互に排他的ではない方法で走らせたい。私はただ彼らがメインスレッドが彼らが先に進むことが大丈夫だと言うまで待ちたいと思う。 –