1

シングル スレッド ライブラリを使用するメイン プロセスがあり、メイン プロセスのライブラリ関数しか使用できません。ネットワークから受信した情報をキューに入れる親プロセスによって生成されたスレッドがあります。

何かがキューに入っていることをメイン プロセスに伝える必要があります。その後、キューにアクセスしてオブジェクトを処理できます。ライブラリは 1 つのプロセスでしか呼び出せないため、スレッドはこれらのオブジェクトを処理できません。

パイプとシグナルを使用する必要があると思います。また、さまざまなニュースグループから、「自己トリック」パイプを使用する必要があることを読みました。

このシナリオはどのように実装する必要がありますか?

次の投稿のより具体的なケース:

メインプロセスとスレッドの間でUNIXパイプをどのように使用できますか?

4

3 に答える 3

2

単純な FIFO (名前付きパイプ) を使用しないのはなぜですか? メイン プロセスは、何かを読み取れるまで自動的にブロックされます。
ブロックすべきではない場合は、代わりにポーリングできるはずですが、CPU を吸う可能性があります。この目的のための効率的なライブラリがおそらく存在します。

シグナルは間違いやすいので、シグナルの使用はお勧めしません。とにかくそれらを使用したい場合、私が見つけた最も簡単な方法は次のとおりです。

  • すべてのスレッドですべてのシグナルをマスクし、
  • 特別なスレッドが でシグナルを処理しsigwait()ます。たとえば、条件変数を使用して、シグナルを処理する別のスレッドを起動する必要がある場合があります。

利点は、どの関数がハンドラーから安全に呼び出されるかを心配する必要がないことです。

于 2009-06-09T21:11:50.507 に答える
0

「最適な」ソリューションは、具体的な設定に大きく依存します。メイン スレッドと子スレッドを持つ 1 つのプロセスがありますか、または 1 つの親プロセスと子プロセスがありますか? どの OS とどのスレッド ライブラリを使用していますか?

最後の質問の理由は、現在の C++03 標準には「スレッド」の概念がないためです。これは特に、OS とスレッド ライブラリが提供するソリューションがプラットフォーム固有であることを意味します。最も移植性の高いソリューションは、実装時にこれらの詳細を隠すだけです。

特に、C++ のメモリ モデルにはスレッドの概念がなく、アトミック操作、同期、順序付けられたメモリ アクセス、競合状態などの概念もありません。

ただし、どのライブラリを使用していても、プラットフォームの問題に対する解決策が既に提供されている可能性があります。

于 2009-06-09T21:43:49.553 に答える
0

このようなスレッド セーフなキューを使用することを強くお勧めします(記事とソース コード)。私は個人的にそれを使用しましたが、それは非常に使いやすいです。API は、push()、try_pop()、wait_and_pop()、empty() などの単純なメソッドで構成されています。

Boost.Threadに基づいていることに注意してください。

于 2009-06-09T21:06:53.217 に答える