2 つのスレッドがあり、すべてが同じコアで実行されています。2番目のスレッドと1番目のスレッドがロックを要求すると、2番目のスレッドはミューテックスからすぐにロックを取得し、1番目のスレッドは待機する必要があります。この優先順位は2番目のスレッドに与えられるべきです。
2 に答える
両方のスレッドが同じコアで実行されているため、タイムスライスされます。これは、任意の時点でスレッドA
またはスレッドのいずれかB
が実行されている (またはどちらも実行されていない) ことを意味します。説明した方法でロックをバイアスするには、スレッドA
がスレッドのアクションを予測しB
、スレッドがロックを必要としている場合はロックの取得を保留できるB
必要があります。これはワームの主要な缶です。
設計を再考することをお勧めします。
SMPシステムで特定のスレッドが「勝つ」という保証があるとは思えないので、シングルコアシステムを使用していない限り、それを行うことはできません(シングルコアの場合は機能する場合と機能しない場合があります)。 、スケジューラーの動作に応じて)。
考えてみましょう:while(something){mutex_lock(); ...何かをする...mutex_unlock(); }
ここで、このコードを実行しているスレッドが2つある場合、最初に「mutex_lock」に到達するのは誰かという競争になります。ほとんどの場合、ロックを保持しているスレッドが勝ちます。これは、他のスレッドが最初にシェデュラーによってスケジュールされる必要があるためです。ループを実行しているスレッドは、ループ内の最初の命令にのみジャンプします。
したがって、同期して動作するために2つのスレッドが必要な場合は、ある種の段階的な同期メカニズムを使用する必要があります。このメカニズムでは、一方のスレッドがもう一方のスレッドが「実行」されるのを待ってから続行します。これを行うにはいくつかの方法がありますが、すべて共有IPCメカニズムを使用する両方のスレッドが必要になります。
スレッドが何をしているのかをもっと説明すると、問題を解決する簡単な方法があるかもしれませんし、複雑かもしれません...