3

私のプログラムの1つには、複数のクライアントがあり、各クライアントには独自のバッファーがあります。無限ループで、クライアントのいずれかにディスクに書き込むデータがあるかどうかを確認します。もしそうなら、私は同じことをして続行します。

さて、クライアントは実際には私の制御下にないデータ(いくつかの計算の結果)を書き込むため、動的バッファーが必要です。したがって、擬似コードは次のようになります。

//If data is ready
//Append(client_id, line)

void Append(int client_id, char *line) {
   if(client_id.buffer == NULL) {
      buffer = (char*)malloc(BUFFERSIZE * sizeof(char));
      //Copy line into buffer
   } else {
      //Realloc the buffer if insufficient space and append this
      //line to the existing buffer
   }
}

または、他のアプローチは、単純なメッセージキューを使用することです。私は既存のキューにメッセージ(文字列)を追加し続け、それからそれらを読み上げます。他にもっと良いアプローチはありますか?

4

1 に答える 1

3

私はあなたのアーキテクチャを完全には理解していないかもしれませんが、私の理解では、クライアントは ID と char * を渡してあなたを呼び出し、それをディスクに書き込むように求めています。

元のバッファをコピーしなければならない理由はありますか? そうすることで、すべてを 2 回メモリに保持し、メモリ管理を台無しにする機会が生じます。可能であれば、元のバッファから作業してください。

ここでいくつかのスレッドが発生していますか?これがすべてシングル スレッドである場合 (この「サーバー」コードの観点からすると、少なくとも 1 つのスレッドでポーリングして結果を書き込む必要があります)、FIFO は実際には必要ありません。クライアント。クライアントをポーリングするスレッド (または複数のスレッド) と、結果を書き込む別のスレッドがある場合、FIFO はスレッド通信を編成する優れた方法です。

于 2010-02-02T03:48:33.400 に答える