2009-05-15 4 views
1

たとえば、ウィンドウ上にメッセージ、ソケットイベント、非同期io(IOCompletionRoutine)、およびmutexハンドルを非同期に待機させるMsgWaitForMultipleObjectsがあります。pthreadsを使用してプラットフォーム上で非同期スレッド間通信を行う方法

Unixでは、pthread_mutexのロックが解除されたときに中断する可能性を除いて、すべてを選択/選択できます。

物語:

私は複数のソケット、パイプやファイルで何かをするメインスレッドを持つアプリケーションを持っています。今では時々、サイドジョブ(dbトランザクション)があり、これは時間がかかり、メインスレッドで同期して実行すると、ソケットの通常のサービスが中断されます。だから私は別のスレッドでDB操作をしたい。そのスレッドは、メインスレッドが何らかの仕事をしてmutexをロック解除してdbスレッドがそれをつかむことができるまで、アイドル時にいくつかのミューテックスを待機します。 問題は、dbスレッドがジョブを終了したメインスレッドにどのように通知できるかです。メインスレッドはソケットを処理しなければならないので、pthread_mutex_lockでスリープ状態にすることはできません。定期的にpthread_mutex_trylockを実行することは、私がやりたいことです。現在、パイプの使用を検討していますが、これはより良い方法ですか?

答えて

1

ここではパイプを使用することをお勧めします。他のプロセスがパイプの書き込み終了を開いていないことを確認してから、メインスレッドのread()またはpoll()を選択して読み取ります。ワーカースレッドが作業を終えたら、書き込み終了を閉じます。メインスレッドのselect()はすぐに起動します。

Linuxではmutexがファイル記述子をサポートしていないfutex(2)システムコールで実装されているため、mutexを待つことはできません。

+0

はい、質問は、パイプより安いものがあります。 –

+0

ptsが正しい場合は、パイプを使用してください。あなたが記述したもの(選択/ポーリング/ kqueueモデル)によく似ています。 –

0

私はあなたの特定の問題にどれだけうまく対応しているのかわかりませんが、posixはmessage queuesです。

関連する問題