1

私は最近、C# での EventWaitHandle の強力な動作の光を見て、同じことを行うために姉妹アプリケーションの一部の機能を移動することにしました。唯一の問題は、姉妹アプリが C で記述されていることです。

大したことではありません。シグナルを許可する pthread_cond_t データ型を持つ pthreads を使用しています。私の唯一の質問は、何かが待っている前に条件を「通知」することは可能ですか?

現在、私のテストではノーと言われています。つまり、ThreadB が待機する前に ThreadA がシグナルを起動すると、ThreadB は無期限に待機します。C# の EventWaitHandle の機能により近い動作をする、使用できる別の pthread タイプはありますか? オブジェクトはシグナル状態です。これは、オブジェクトを待機する最初のスレッドがすぐに渡され、シグナルなしに設定されることを意味します。

pthread_cond を別のデータ構造にラップすることは、これを達成するのにそれほど難しくありません。繰り返しになりますが、この機能は pthread ライブラリで既に利用可能ですか?

4

3 に答える 3

4

条件変数を正しく使用している場合、これは問題になりません。

コードの基本的なフローは次のようになります (疑似コード)。

lock(lockobj);
while (!signalled) {
    wait(condvar);
}
signalled = false;
unlock(lockobj);

待っている側で、そして:

lock(lockobj);
signalled = true;
notify(condvar);
unlock(lockobj);

信号側です。(もちろん、使用されるロック オブジェクトと条件変数は両側で同じでなければなりません。) これが役に立てば幸いです。

于 2008-09-27T07:01:35.153 に答える
0

条件タイプを新しい構造でラップするだけで、C#のEventWaitHandleのように動作するいくつかの単純な関数を作成しました。適切なシリアル化されたアクセスを実現するには、2つのミューテックスが必要でした。

cond_mutexは条件変数を待機するために使用され、data_mutexは状態をシグナルからシグナルなしに設定するときに使用されます。

リセットモードはC#と同じです。AUTOまたはMANUAL。これにより、event_wait_tは待機後に自動的にリセットされます。または、event_wait_reset(event_wait_t * ewh);を呼び出して、プログラマーに手動で実行させます。

于 2008-09-29T02:57:17.627 に答える
0

複数のシグナリングが必要な場合の代替回答 (疑似コードでも) (つまり、2 回シグナリングされた場合、状態が再び非シグナリングになる前に 2 つのスレッドが待機できます)。

待機側:

lock(lockobj);
while (signalled != 0) {
    wait(condvar);
}
--signalled;
unlock(lockobj);

シグナリング側:

lock(lockobj);
++signalled;
notify(condvar);
unlock(lockobj);
于 2008-09-27T07:08:26.307 に答える