pthread_cond_tのEventWaitHandleの動作
-
02-07-2019 - |
質問
最近、C#でのEventWaitHandleの強力な動作の光を見て、同じことを行うために姉妹アプリケーションの一部の機能を移動することにしました。唯一の問題は、姉妹アプリがCで書かれていることです。
大したことではありません。私はpthreadsを使用していますが、pthread_cond_tデータ型はシグナリングを可能にします。私の唯一の質問は、何かが待っている前にcondが「合図」されることは可能ですか?
今、私のテストはノーと言っています。つまり、ThreadBが待機する前にThreadAが信号を発した場合、ThreadBは無期限に待機します。 C#のEventWaitHandleの機能に近い動作をする別のpthreadタイプがありますか?オブジェクトはシグナルを受け取ります。つまり、オブジェクトを待機する最初のスレッドはすぐに通過し、シグナルなしに設定します。
pthread_condを別のデータ構造にラップするのは、それほど難しくありません。しかし、この機能はすでにpthreadライブラリで利用可能ですか?
解決
条件変数を正しく使用している場合、これは問題になりません。
コードの基本的なフローは(擬似コードで)である必要があります:
lock(lockobj);
while (!signalled) {
wait(condvar);
}
signalled = false;
unlock(lockobj);
待機側で、および:
lock(lockobj);
signalled = true;
notify(condvar);
unlock(lockobj);
シグナリング側。 (もちろん、使用されるロックオブジェクトと条件変数は両側で同じである必要があります。)これが役立つことを願っています!
他のヒント
複数のシグナルが必要な場合の代替答え(擬似コードでも)(つまり、2回シグナルされる場合、2つのスレッドは状態が再びシグナル解除される前に待機できます)
待機側:
lock(lockobj);
while (signalled != 0) {
wait(condvar);
}
--signalled;
unlock(lockobj);
シグナル側:
lock(lockobj);
++signalled;
notify(condvar);
unlock(lockobj);
最終的に、新しい構造体に条件タイプをラップし、C#のEventWaitHandleのように動作する簡単な関数をいくつか作成しました。適切なシリアル化アクセスを実現するには、2つのミューテックスが必要でした。
cond_mutexは条件付き変数の待機に使用され、data_mutexは状態をシグナル状態からシグナルなしに設定するときに使用されます。
リセットモードはC#と同じです。 AUTOまたはMANUAL。これにより、event_wait_tは待機後に自動的にリセットされます。または、event_wait_reset(event_wait_t * ewh)を呼び出してプログラマーに手動で実行させます。