0

このフォーラムで私の質問を調査したところ、boost::thread に関する同じ基本的な質問が以前に何度も出されたことがわかりましたが、どの回答も私の特定のニーズに答えているようには見えません。私が考えている方法からの質問の要点は、準備が整うまで実際にスレッドを起動せずに、多数のスレッドをインスタンス化する方法です。答えは常に、各スレッドをインスタンス化する前に、各スレッドを起動する準備が整うまで待ってはいけません。確かに、boost::thread が機能するように設計されているように思えます。つまり、boost::thread オブジェクトをインスタンス化すると、スレッドも起動する必要があるように見えますが、これらの関数を本当に分離できるかどうかはわかりません。

私のアプリケーションについて、他の質問者が説明したよりももう少し詳しく説明しようと思います。数百または数千のスレッドではないにしても、少なくとも数十のスレッドを起動する必要があります。各スレッドはまったく同じ関数を実行し、スレッドは、各スレッドの一部として関数に渡される単一の一意の引数によって互いに区別されます。各スレッドは、読み取り専用で同期する必要のない大量の共有メモリを使用します。各スレッドは、動的に割り当てられ、スレッドの完了前に解放されるかなりの量のローカル メモリも使用します。ローカル メモリも同期する必要はありません。確かに、私は'

プログラムは数十時間、場合によっては数百時間、場合によっては数千時間も実行されるため、マシン上のすべてのプロセッサ コアを使用したいのですが、同時に実行するプロセッサ コアの数よりも多くのスレッドを開始したくありません。利用可能です。問題は、同時に開始するスレッドが多すぎると、各スレッドがローカル メモリを使用するため、マシンのメモリがすぐに使い果たされることです。しかし、プロセッサ コアと同じ数のスレッドのみを開始できれば、メモリの状況は問題ありません。

したがって、n 個のコアがある場合、n 個のスレッドを起動し、そのうちの 1 つが完了するまで待ちます。そのうちの 1 つが完了したら、すべての作業が完了するまで、もう 1 つ起動したいと考えています。私はthread_groupとjoin_allを見てきました。thread_group 自体では、(n+1) 番目のスレッドをインスタンス化する前に、最初の n スレッドのいずれかが完了するまで待機する方法がわかりません。また、待ちたいだけなので、join_all は本当に必要なものではありません。実行中のスレッドが n 個未満になるまで、どちらが最初に終了しても問題ありません。アクティブなスレッドの数が n 未満になるたびに、新しいスレッドを起動したいと考えています。add_thread() が何らかの形でこれに関与することは間違いありません。また、boost::thread size() 関数が何らかの形で関与することも確信しています。でも、できるのに' すべてのピースを組み合わせる方法を実際に確認することはできません。そして、問題は常に、スレッドをインスタンス化する方法を、準備が整ったときにしか理解できないことに帰着するようです。たとえば、私が見つけたすべての boost::thread の例には、「静的に名前が付けられた」スレッド オブジェクト、つまり、「boost::thread MyWorkerFunction」など、コード内で遭遇するとインスタンス化されるように見えます。同じ MyWorkerFunction に対して何千ものスレッドを使用できますが、同時に n 個のスレッドのみをディスパッチしたいのですが、その方法がわかりません。

ありがとう、ジェリー

4

0 に答える 0