私には2つのスレッドがあります。1つはタイトなループで動作し、もう1つは時々最初のスレッドとの同期を実行する必要があります。
// thread 1
while(1)
{
lock(work);
// perform work
unlock(work);
}
// thread 2
while(1)
{
// unrelated work that takes a while
lock(work);
// synchronizing step
unlock(work);
}
私の意図は、スレッド2がロックを取得することにより、スレッド1を効果的に一時停止し、必要な同期を実行できるようにすることです。スレッド1は、ロックを解除して一時停止することもできます。スレッド2がロックを待機していない場合は、再度ロックして作業に戻ります。
私が遭遇した問題は、ミューテックスが公平ではないため、スレッド1がミューテックスをすばやく再ロックしてスレッド2を枯渇させることです。使用しようとしましたがpthread_yield
、これまでのところ問題なく動作しているようですが、すべてのシステム/コアの数。マルチコアシステムであっても、スレッド1が常にスレッド2に譲ることを保証する方法はありますか?
この同期プロセスを処理する最も効果的な方法は何ですか?