Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:对于这个要求,有什么比FIFO队列实现更好的方法吗?_C_Malloc_Message Queue_Buffering - Fatal编程技术网

C:对于这个要求,有什么比FIFO队列实现更好的方法吗?

C:对于这个要求,有什么比FIFO队列实现更好的方法吗?,c,malloc,message-queue,buffering,C,Malloc,Message Queue,Buffering,在我的一个程序中,有多个客户端,每个客户端都有自己的缓冲区。在无限循环中,我检查客户机是否有任何数据要写入磁盘。如果是这样,我也会这样做并继续 现在,因为客户机写入的数据实际上不在我的控制范围内(某些计算的结果),所以我需要一个动态缓冲区。因此,伪代码如下所示: //If data is ready //Append(client_id, line) void Append(int client_id, char *line) { if(client_id.buffer == NULL)

在我的一个程序中,有多个客户端,每个客户端都有自己的缓冲区。在无限循环中,我检查客户机是否有任何数据要写入磁盘。如果是这样,我也会这样做并继续

现在,因为客户机写入的数据实际上不在我的控制范围内(某些计算的结果),所以我需要一个动态缓冲区。因此,伪代码如下所示:

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

或者,另一种方法是使用简单的消息队列。我会不断地将任何消息(字符串)添加到现有队列中,然后读取它们。还有其他更好的方法吗?

我可能还没有完全理解您的体系结构,但我的理解是,客户机通过传递ID和字符*来调用您,并希望您将其写入磁盘

是否有理由必须复制原始缓冲区?通过这样做,内存中的所有内容都有了两次,并且有机会扰乱内存管理。如果可能的话,只需去掉原始缓冲区


这里发生了什么事吗?如果这都是单线程的(从这个“服务器”代码的角度来看,至少有一个线程用于轮询和写入结果),那么实际上并不需要FIFO,因为事情只会按照轮询客户端的顺序发生。如果有一个线程(或多个线程)来轮询客户端,有一个单独的线程来写入结果,FIFO是组织线程通信的一种很好的方式。

对我来说,这听起来是线程安全队列的完美使用案例。谢谢。。我正要去,但我的代码,因为它现在是相当简单的。。。暂时没有线程。谢谢。。。我会听从你的建议。。。我需要看看我能如何实现这一点……:)