服务器具有正在运行的线程时,为什么fopen被阻止?

时间:2018-11-06 18:03:22

标签: multithreading pipe fopen

当服务器打开管道进行读取并通过std :: async启动线程时,客户端第一次可以打开管道进行写入,但是如果客户端再次写入,则客户端将被阻塞直到线程结束,服务器可以打开以读取管道。 有想法吗?

1 个答案:

答案 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获取更多消息。 但是如果客户端尝试再次发送消息,则它将在客户端打开时被阻止,直到服务器线程完成处理,服务器才能继续接收客户端的消息。

我希望客户端不会被阻止发送消息,服务器应该立即接收到该消息,然后中止上一条消息以处理新消息。