ロックを自動的に解放できるpthreadsAPIを知りません。
個人的には、これらの複雑さを回避するために、単一のスレッドを介してバスへのアクセスをシリアル化しようとします。そのスレッドが入力キューを維持し、他のスレッドがそのスレッドに要求を送信する場合、必要なシリアル化と競合解決を実行できます。これにより、さらにアクセスする前の遅延の実装も容易になります。このスレッドでブロッキング関数を使用しないように注意している限り、実際の失敗の唯一のケースは、誤って終了する可能性があることです。
バスからの読み取りと書き込みの両方が必要な場合は、すべてのスレッドに入力キューを与え、ワーカースレッドに「読み取り要求」をIOスレッドに送信させてから、応答が独自の入力キューにポストバックされるのを待つことができます。スレッドに対する未処理のリクエストが1つしかない場合は、キューは実際には必要ありません。単純な条件変数と、入力する構造体へのポインターが適切に機能する可能性があります。
2つのスレッドでリソースを共有したい場合は、ミューテックスがロックされるリスクが常にあると思います。タイマーを設定し、一定時間後にミューテックスを強制的に解放したとしても、実際には別のスレッドによって完全に保持されているにもかかわらず、スレッドがロックを持っていると信じてリソースを使用し続けるという別のバグが発生する可能性があります。最終的には、将来のプログラミングエラーに対する堅牢性を計画しようとしています。これはすばらしい目標ですが、制限があります。ミューテックスは注意が必要なものです。
ミューテックスルートを使用する必要がある場合の最善のアプローチは、ミューテックスを必要とするコードを単純に最小化し、その中の呼び出しをブロックしないようにすることです。ステートマシンを実装している場合は、状態遷移の間にミューテックスがロックされたままになる必要がないことを確認してください。可能であれば、ミューテックスロックのスコープを設定して、コールチェーンのあるレベルで単一の関数呼び出しの間だけ保持されるようにします。これにより、ロック/ロック解除の不一致を目で見つけるのがはるかに簡単になります。C ++を使用している場合は、RAIIを使用して、ロックの解放の信頼性を高めます。
しかし、繰り返しになりますが、通常は1つのスレッドをアービター(既存のスレッドまたは新しいスレッドのいずれか)として宣言することで、何らかの方法でリクエストをシリアル化する方がはるかに簡単だと思います。