5

私はC言語でpthreadを使ってプログラミングしています。スレッドが他のスレッドにメッセージをメッセージキューに入れたことを通知して、他のスレッドがメッセージキューからメッセージをフェッチできることを認識できるようにします。ただし、シグナルを送信したスレッドは、スレッドID、メッセージタグなど、他のスレッドにより多くの情報を提供する必要があります。どうやってするか ?

pthread_kill関数は知っていますが、ほとんど情報が必要ないようです。他のスレッドへのスレッド送信シグナルを使用するときに、より多くの情報を取得できますか?

4

2 に答える 2

6

Cの意味でのシグナルは、「より多くの情報」を取得できません。より多くの情報を送信する場合は、シグナルの一部としてではなく、メッセージの一部としてmessage_queueに含める必要があります。

選択肢はたくさんあると思います。あなたがそれらについて考えていないというだけです。私が言ったように、信号を使用したい場合は、信号を使用してメッセージがあることを示し(電話の呼び出し音など)、メッセージキューを使用して実際の情報を伝えます(電話で話します)。電話でメッセージを伝えるために電話の呼び出し信号を使用しませんよね?

しかし、スレッドとシグナルの使用法をどういうわけか誤解しているのではないかと心配しています。私は、あなたがしていることを何でも解決するためにあなたが想定されている方法が正しい方法ではないと確信しています。

あなたの質問は「信号で整数以上を送信するにはどうすればよいですか。Arnoの答えを受け入れて、それでも問題が解決しない場合は再試行する必要があると思います。全体的な問題は、何をしようとしているのかを説明したものです。解決する-今、あなたはボルトを失う方法について整備士と話しているが、あなたが本当にする必要があるのはパンクを修正することである、それであなたは細部を解決する方法に集中しすぎて、あなたが持っていないという事実を混乱させるかもしれない車を地面から持ち上げるためのジャックさえ持っていました...

于 2012-12-29T15:20:01.883 に答える
4

プロセスのスレッドは同じアドレススペースを共有します。したがって、スレッド間通信用にミューテックスで保護されたメッセージキューを作成するのが一般的です。詳細については、この回答を参照してください。sender ThreadIDメッセージキューは、カスタムデザイン、たとえば、、、などの要素を含む可能性のあるリンクリスト構造receiver ThreadIDthe messageおよびオプションの任意の数のadditional parameters同様のメッセージ状態などにすることができます。unique message IDまた、キューからメッセージを削除するかどうかなど、受信スレッドに続行する方法を指示するためのパラメータが含まれている場合もあります。シグナルを使用して、新しいメッセージのメッセージキューのポーリングを回避できます。シグナルはスレッドをトリガーして、ミューテックスで保護されたメッセージキューを読み取って新しいメッセージを探します。別の方法は、で説明されているように、イベントスキームを構築することですこの答え。ただし、これは実際にはミューテックスで保護されたグローバル識別子であり、待機中のスレッドが変更をポーリングしています(いわゆるビジー待機)。ミューテックスで保護されたメッセージキューでビジーウェイトをすぐに実行できます。の詳細については、このリンクを参照してくださいpthread_cond_wait

于 2012-12-29T17:26:17.313 に答える