关闭多线程程序中的文件描述符

pik*_*ika 1 c multithreading network-programming

我有一个线程来接受传入连接:

pthread_t thread;

pthread_create(&thread, NULL, worker_func, NULL);
pthread_detach(thread);
Run Code Online (Sandbox Code Playgroud)

然后worker_func

<snip>
fd = accept(GlobalFD, NULL, NULL);
<snip>
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试GlobalFD在原始线程中关闭,accept 仍会阻塞(如果 GlobalFD 关闭,我希望它失败)。我在网上查看了其他问题,但似乎找不到我的特定问题的答案。

有任何想法吗?谢谢

Joh*_*ger 5

同一程序的不同线程共享内存,包括文件描述符表。如果一个线程关闭了 FD,那么所有其他线程也会关闭该 FD。这是使用多线程和使用多进程之间的区别之一。因此,不允许一个线程关闭另一个线程依赖于保持打开状态的文件描述符。

然而,更一般地说,您必须非常小心地修改共享数据。一般来说,您必须通过信号量、条件变量或其他对同步有意义的构造或操作来同步访问。否则程序行为没有明确定义。特别是,您不能期望关闭文件描述符会导致在不同线程中运行的活动 I/O 函数终止。相反,向目标线程发送信号。

  • @pika这样做不是一个好主意:当您打开一个新文件时,文件描述符编号很可能会被重用。 (2认同)