2016-03-20 9 views
1

配管中に面白い問題が発生しました。パイプの間で非同期の動作をエミュレートしたいとします.1つの親プロセスと複数の子プロセスがあります。親プロセスと子プロセスはお互いに話すことができます。しかし、私が遭遇したことは、これまでのところ通信が原子的であることです。それはいくつかの計算をし、私はすべての子供たち パイプによる非同期動作の実現

  • 2.
  • 3.子供のループを介して子どもたちに、データセットのデータのCHUNK_SIZEを送信したデータセット

    • 1.最初に作成している場合ということですか何とは
    • 4.親はその子が

  • からのデータを受信するバック親にそのデータを渡し、トラブルが私の通信がアトミックであるということです、私はすべてのデータを送信する必要がありますし、それを読んで。子供がほとんど瞬時に読むのでパイプがいっぱいになるのを心配する必要はないので、送信は正常です。しかし、すべての子どもたちは仕事をしてデータを返すが、親はすべてのデータの送信が終了するまでこれを読まない。すなわち、ステップに親が到達する前に、1つの子供が親に補充されることがあります。これを回避する1つの方法は、データを送信してからもう一度別のデータセットを送信する前に受信することですが、この方法ではすべての点が失われます。別の方法はまだ fork()にもう一度子供にこれを扱うことである。しかし、これは問題を他のどこかに移しているだけです。これは私の設計上の問題だと思いますが、1つのプロセス内のコードが一度に2つの場所になければならないため、不可能と思われます。 (すなわち、子に readingwritingのデータです)。この方法でパイプのみを使用して「真の」非同期動作を設計する際のベストプラクティスまたはヒントを教えてください。

    +1

    あなたの正確な関心事が何であるかは不明です。 "パイプが子供の一人を親に詰めることができます"。それは事実ですが、それがなぜあなたにとって問題であるのかを述べる必要があります。パイプがいっぱいになると、子プロセスは 'write'呼び出しをブロックします。これは望ましい動作である場合とそうでない場合があります。そうでない場合は、なぜ、どのような行動を達成しようとしているのかを説明する必要があります。あなたが達成しようとしている "非同期"の振舞いに依存して、一般的なテクニックは、 'select'や' poll'やスレッドを使ってIO多重化を使うことです。 – kaylum

    答えて

    2

    これはselectを使用して行うことができます。 Selectは、あなたのパイプの読み書きの準備が整った時を知らせます。

    +0

    新しいコードで 'select()'を使わない*。代わりに 'poll()'を使用してください。 – Dummy00001

    関連する問題