我应该在完成后关闭由多个线程写入的单个 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 用于单个进程的线程之间的通信,那么管道可能会更好。
我正在试验一个虚构的 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 用于单个进程的线程之间的通信,那么管道可能会更好。