n プロセッサ システムで使用するために、単純なパスワード クラッカーを並列化する必要があります。私の考えは、n個のスレッドを作成し、それらが終了するにつれて、それらにますます多くの仕事を与えることです。
スレッドがいつ終了したかを知る最良の方法は何ですか? ミューテックス?他のスレッドが実行されている間、このミューテックスを常にチェックするのは高価ではありませんか?
n プロセッサ システムで使用するために、単純なパスワード クラッカーを並列化する必要があります。私の考えは、n個のスレッドを作成し、それらが終了するにつれて、それらにますます多くの仕事を与えることです。
スレッドがいつ終了したかを知る最良の方法は何ですか? ミューテックス?他のスレッドが実行されている間、このミューテックスを常にチェックするのは高価ではありませんか?
単純なキュー構造を持つことができます-好きなデータ構造を使用してください-そして、アイテムを追加/削除するときにミューテックスを使用するだけです。
スレッドが必要な作業を十分に大きな「チャンク」で取得する場合、ミューテックスでの競合はほとんどないため、オーバーヘッドはほとんどありません。
たとえば、各スレッドが一度に約 1 秒の作業を取得し、1 秒間独立して作業する場合、mutex に対する操作はほとんどありません。
スレッドは、作業がなくなったときに終了する可能性があります。その後、メイン スレッドは pthread_join を使用して待機できます。
通常、非同期ジョブが終了するのを待ちたいこの種のものには「条件変数」を使用します。
条件変数は、基本的にミューテックスで保護された単純なシグナルです。Pthreadには条件変数があります(たとえば、pthread_cond_create(...)関数を参照してください)。
スレッド間でメッセージ キューを使用する:-
マスター -> プロセス (これで行くと言っています)。プロセス -> マスター (終わったと言って - もっとくれ、または、結果を見つけた!)
これを使用すると、スレッドはシステムが閉じたときにのみ閉じます。それ以外の場合は、データを処理しているか、メッセージ キューで待機しています。
このように、MCP (私は常にそう言いたかったのです!) は、単純にメッセージを処理し、次の作業を待っているスレッドにジョブを渡します。
これは、常にスレッドを作成および破棄するよりも効率的です。