0

私は頭をつぶしていますが、これに対する解決策が見つかりません。次のシナリオを検討してください。

ローカルネットワーク上の別のマシンへの非ブロッキング「キュー」に書き込みたいライターがあり、データを読み取り(ライターがない場合はブロッキングモード)、ジョブAを実行してから長い時間後に戻るリーダーがありますそして次のデータを取ります。

したがって、シナリオは次のようになります。

  • 作家が書く
  • 作家が書く
  • 作家が書く
  • 作家が書く
  • 作家が書く
  • 読者が読んで仕事をする

    リーダーがビジー状態であると同時に:

  • 作家が書く
  • 作家が書く
  • 作家が書く
  • 作家が書く
  • 作家が書く
  • など...

tcpデーモンをリーダーとしてこれを実行できると思っていましたが、それはフォークと同時に実行されることを意味し、リーダーはCPUを大量に消費するため、一度に1つずつ処理する必要があります。

TCPサーバーにリクエストを取得させてからFIFOに通知し、別のデーモンにFIFOから読み取らせることを考えましたが、同じ制限があります。

つまり、ライターが書き込むときに FIFO を読み取る必要があり、ライターはリーダーよりも何倍も高速に書き込む必要があります。

db ソリューションは問題ありませんが、a) あまり高速ではなく、b) リーダーのロックがありません..sleep(x) を使用して実装したくないため、適切なプログラミング手法ではないようです。

解決策はありますか?

4

3 に答える 3

1

これは、生産者と消費者の問題があるかのように聞こえます。ウィキペディアの記事にあるさまざまな実装を見て、そのうちの 1 つがニーズを満たすかどうかを確認してください。

于 2009-10-01T08:26:59.097 に答える
0

1 つのオプションは、サーバー (ライター) とクライアント ノードを持つことです。これは、一般的なアプローチの概要を示しています。

サーバーはジョブを生成し、ローカル キューにプッシュします。

// server thread
while(true)
{
     job = generate();
     jobs_queue.push(job); // push job to a local queue on the server
}

クライアントがサーバーに接続すると、サーバー上のスレッドがキュー内のすべてを読み取り、それをクライアントにプッシュします。クライアントが接続されていない間、キューはジョブを保持する必要があります。あなたの場合は無関係かもしれません。

// server acceptor
while(true)
{
     c = wait_for_connection();
     while(connected(c))
     {
          while(queue.size() >  0)
              c.write(queue.pop()); // send a job to the client

          // block till queue is not empty. can be achieved with sleep or by using a mutex.
     }
}

クライアント ノードは tcp ソケットに置かれ、ジョブを読み取り、それらを (クライアントの) ローカル キューに入れます。次のように機能するクライアント スレッドがあります。

// client thread that poll from server
while(true)
{
    job = readNextJob(); // tcp, blocks if there is nothing to read
    queue.push(job);
}

// client thread that spawn jobs from queue
while(true)
{
    job = queue.pop(); // blocks if queue empty
    job.execute();
    job.waitForCompletion();
}
于 2009-10-01T08:35:55.643 に答える
0

マルチスレッドは、従うべき道のようです。読み取り部分または書き込み部分のいずれかを開始するスレッドを作成し、他のタスクで他のスレッドを使用します。リーダーからライターにデータを渡す必要がある場合は、スレッド間でスレッド セーフな通信を提供する必要があります。アプリケーションのコンテキストによっては、書き込みに複数のスレッドを使用することを検討することもできます。

POSIX システム上のプレーン C では、pthreads が最適です。

于 2009-10-01T08:31:44.147 に答える