C: Есть ли что-то лучше, чем реализация FIFO Queue для этого требования? - PullRequest
3 голосов
/ 02 февраля 2010

В одной из моих программ есть несколько клиентов, и каждый клиент имеет свой собственный буфер.В бесконечном цикле я проверяю, есть ли у клиента какие-либо данные для записи на диск.Если это так, то я делаю то же самое и продолжаю.

Теперь, поскольку клиент записывает данные, которые на самом деле не находятся под моим контролем (результат некоторых вычислений), мне нужен динамический буфер.Таким образом, псевдокод будет выглядеть следующим образом:

//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
   }
}

, иначе можно использовать простую очередь сообщений.Я продолжал бы добавлять любые сообщения (строки) в существующую очередь и затем читать их.Есть ли какой-нибудь другой лучший подход?

1 Ответ

3 голосов
/ 02 февраля 2010

Возможно, я не полностью понял вашу архитектуру, но, насколько я понимаю, клиент звонит вам, передавая свой идентификатор и символ *, и хочет, чтобы вы записали его на диск.

Есть ли причина, по которой вам нужно скопировать исходный буфер? Делая это, вы получаете все в памяти дважды и возможность испортить управление памятью. Если возможно, просто отработайте оригинальный буфер.

Есть ли здесь какие-то потоки? Если все это однопоточное (с точки зрения этого "серверного" кода хотя бы ... один поток для опроса и записи результатов), вам действительно не нужен FIFO, поскольку все будет происходить в том порядке, в котором вы опрашиваете клиентов. Если есть поток (или несколько) для опроса клиентов и отдельный поток для записи результатов, FIFO является отличным способом организации связи потоков.

...