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

标签 c multithreading network-programming

我创建了一个线程来接受传入连接:

pthread_t thread;

pthread_create(&thread, NULL, worker_func, NULL);
pthread_detach(thread);

然后 worker_func 做:

<snip>
fd = accept(GlobalFD, NULL, NULL);
<snip>

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

有什么想法吗? 谢谢

最佳答案

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

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

关于在多线程程序中关闭文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31545952/

相关文章:

c++ - scanf在c++中的表示是什么

c++ - 优雅地停止 std::thread?

ios - NSMutableURLRequest 和 "request body stream exhausted"错误

java - 多个用户的 csv 并发处理

c++ - 多任务处理在我的 C++11 程序中不起作用

c# - UnityWebRequest 和/或 HttpWebRequest 在 Android 上使用 PUT 给出 403

network-programming - Go - net.LookupAddr 不执行

收集2 : error: ld returned 1 exit status (Pebble - C)

C:永远不会返回语句

c - 为什么这不会打印?