我应该在完成后关闭由多个线程写入的单个 fifo 吗?

Should I close a single fifo that's written to by multiple threads after they are done?

我正在试验一个虚构的 server/client 应用程序,其中客户端在一段(可能非常长的)时间段内启动请求线程,中间有很小的延迟。每个请求线程将请求的内容写入 'public' fifo(所有客户端和服务器线程都知道),并在服务器创建的 'private' fifo 中接收服务器应答隐含地知道(在我的例子中,它是 'tmp/processId.threadId')。

public fifo 在主(请求线程生成器)线程中打开一次,以便所有请求线程都可以写入它。 因为我不关心我的请求线程的 return 值,而且我不能确定我创建了多少个请求线程(以便我存储它们的 id 并稍后加入它们),我选择创建线程在分离状态下,当指定的超时到期时退出主线程并让已经生成的线程自行运行。

所有这一切都很好,但是,在所有派生的请求线程完成后,我不会在任何地方关闭 public fifo:毕竟,我没有等待就退出了主线程。这是一种小灾难吗,在这种情况下我绝对需要计算活动线程(可能使用条件变量)并在它为 0 时关闭 fifo?我是否应该接受文件没有明确关闭,并让 OS 关闭?

我设法解决了这个问题,通过 atexit 设置了一个清理程序,它在进程终止时被调用,即。所有线程完成他们的工作。

All of this is fine, however, I'm not closing the public fifo anywhere after all spawned request threads finish: after all, I did exit the main thread without waiting. Is this a small kind of disaster, in which case I absolutely need to count the active threads (perhaps with a condition variable) and close the fifo when it's 0? Should I just accept that the file is not explicitly getting closed, and let the OS do it?

假设您真正的意思是一个 FIFO,例如可能通过 mkfifo() 创建的,不,进程没有明确关闭它并不是一个特殊的问题。如果进程终止时它上面有任何打开的句柄,它们将被关闭。根据终止的性质,挂起的数据可能未被刷新,但如果 FIFO 仅用于一个进程的线程之间的通信,则这无关紧要。

但是进程没有删除 FIFO 可能是个问题。 FIFO 具有文件系统持久性。一旦你创建了一个,它就会一直存在,直到它不再有任何到文件系统的链接并且不再在任何进程中打开(就像任何其他文件一样)。仅仅关闭它不会导致它被删除。除了在您的文件系统上留下混乱之外,这可能会导致程序的并发或未来运行出现问题。

如果您确实只是将 FIFO 用于单个进程的线程之间的通信,那么管道可能会更好。