単一のスレッドで問題を解決してから、最小のロックが必要な方法がまだ見つからない場合は、並列化を公開するための最適な場所を特定するための支援を依頼してください。使用するスレッドの最適な数は、使用するコンピューターによって異なります。n+1 を超えるスレッドを使用することはあまり意味がありません。ここで、n はプログラムで使用できるプロセッサ/コアの数です。スレッド作成のオーバーヘッドを減らすには、各スレッドに複数のジョブを与えることをお勧めします。
以下は、明確化の編集に対する回答です。
現在、プログラムでは多くのスレッドが作成されており、終了する前にジョブを実行する必要があります。相互排除のため、同時に 1 つのスレッドしかジョブを実行できません。
いいえ。上記のように、最大で n+1 個のスレッドを作成する必要があります。相互排除とはどういう意味ですか?相互排除は「1つのスレッドのみがその作業キューにタスクxを含む」と考えています。これは、他のスレッドがタスク x をロックする必要がないことを意味します。
そのジョブを実行しているスレッドがある間、他のスレッドは待機する必要があります。仕事ができるかどうかをチェックする方法は、条件変数が満たされているかどうかです。
各スレッドに、完了するタスクの独立したリストを提供します。ジョブ x がジョブ y の前提条件である場合、ジョブ x とジョブ y は理想的には同じリストにあるため、スレッドはどちらのジョブでもスレッド ミューテックス オブジェクトを処理する必要がありません。この道を探索しましたか?
while (a == b || c != d){ pthread_cond_wait(&open, &mylock); これはどのくらい効率的ですか? pthread_cond_wait コードで何が起こっていますか? 条件変数を常にチェックする while ループ (舞台裏) ですか?
未定義の動作を回避するために、pthread_cond_wait を呼び出す前に mylock を現在のスレッドでロックする必要があるため、このループに入る前に、コードで pthread_mutex_lock を呼び出して mylock ロックを取得すると仮定します。
- pthread_mutex_lock は、ロックを取得するまでスレッドをブロックします。これは、一度に 1 つのスレッドが pthread_mutex_lock と pthread_cond_wait の間のコード (pthread_cond_wait コード) を実行できることを意味します。
- pthread_cond_wait はロックを解放し、他のスレッドが pthread_mutex_lock と pthread_cond_wait の間でコードを実行できるようにします。pthread_cond_wait が戻る前に、ロックを再度取得できるまで待機します。このステップはアドホックに繰り返され
while (a == b || c != d)
ます。
- pthread_mutex_unlock は、タスクが完了すると後で呼び出されます。それまでは、一度に 1 つのスレッドだけが pthread_cond_wait と pthread_mutex_unlock の間のコード (pthread_cond_wait 後のコード) を実行できます。さらに、1 つのスレッドが pre-pthread_cond_wait コードを実行している場合、他のスレッドが post-pthread_cond_wait コードを実行することはできません。
したがって、ジョブを優先キューに格納するシングルスレッド コードを実行することもできます。少なくとも、不要で過剰なコンテキスト スイッチはありません。先ほど言ったように、「問題は 1 つのスレッドで解決してください」。最適化によってどれだけの時間が節約されるかについて、それを測定するものがない限り、意味のある声明を出すことはできません。
また、スレッドがジョブにかかる時間を知っているので、最初に最短のジョブに関するスケジューリング ポリシーを適用する方が効率的ですか? または、ジョブを実行するスレッドのどの組み合わせでも、プログラムが完了するまでに同じ時間がかかるため、それは問題ではありません。つまり、最初に最短ジョブを使用すると、待機している他のスレッドの CPU オーバーヘッドが減少しますか? 最短のジョブが最初に表示されるため、待ち時間が短縮されるようです。
スケジューリング ポリシーを適用する場合は、シングル スレッド プロジェクトで実行してください。並行性が問題の迅速な解決に役立つと確信している場合は、完成したシングルスレッド プロジェクトを並行性に公開し、その信念を検証するためのテストを導き出します。スレッドが作業を共有する必要がない方法で並行性を公開することをお勧めします。