当服务器打开管道进行读取并通过std :: async启动线程时,客户端第一次可以打开管道进行写入,但是如果客户端再次写入,则客户端将被阻塞直到线程结束,服务器可以打开以读取管道。 有想法吗?
开
答案 0 :(得分:0)
为我令人困惑的描述表示歉意。这是代码段。
服务器端:
#define FIFO_FILE "/tmp/fifo"
while (1)
{
char readbuf[25];
FILE *file = fopen(FIFO_FILE, "r");
fgets(readbuf, 25, file);
std::queue<std::string>().swap(msg);
msg.push(readbuf);
while (!feof(file))
{
fgets(readbuf, 25, file);
msg.push(readbuf);
}
std::cout << "message num: " << msg.size() << std::endl;
std::future<void> ret = std::async (std::launch::async, command_process, std::ref(msg), std::ref(binfo));
fclose(file);
std::cout << "messages are being processed!\n";
}
客户端:
int main(int argc, char *argv[])
{
FILE *fp;
if((fp = fopen(FIFO_FILE, "w")) == NULL) {
perror("fopen \n");
return -1;
}
fputs(argv[1], fp);
fclose(fp);
return 0;
}
服务器启动后,它将在fgets处等待。当客户端将字符串发送到FIFO时,服务器会接收到该字符串并将其存储在msg中, 然后将其传递给线程command_process进行处理,服务器将等待 在fopen获取更多消息。 但是如果客户端尝试再次发送消息,则它将在客户端打开时被阻止,直到服务器线程完成处理,服务器才能继续接收客户端的消息。
我希望客户端不会被阻止发送消息,服务器应该立即接收到该消息,然后中止上一条消息以处理新消息。
开