我有一个我接受传入连接的线程:
pthread_t thread;
pthread_create(&thread, NULL, worker_func, NULL);
pthread_detach(thread);
然后worker_func
执行:
<snip>
fd = accept(GlobalFD, NULL, NULL);
<snip>
但是,如果我尝试在原始线程中关闭GlobalFD
,则接受仍会阻止(如果GlobalFD关闭,我希望它失败)。我看过网上和其他问题,似乎无法找到我特定问题的答案。
有什么想法吗? 感谢
答案 0 :(得分:3)
同一程序的不同线程共享内存,包括文件描述符表。如果一个线程关闭FD,那么它也会关闭所有其他线程。这是使用多个线程和使用多个进程之间的差异之一。因此,不要让一个线程关闭另一个依赖的文件描述符保持打开状态。
但是,更一般地说,您必须非常谨慎地修改共享数据。一般来说,您必须通过信号量,条件变量或其他具有同步意义的构造或操作来同步访问。否则,程序行为没有明确定义。特别是,您不能指望关闭文件描述符会导致在另一个线程中运行的活动I / O函数终止。改为向目标线程发送信号。
答案 1 :(得分:1)
通常,在一个线程中关闭文件描述符不能保证会导致正在等待另一个线程中的文件描述符返回的函数。
您的选择是1)安装信号处理程序并使用pthread_kill()(不要忘记检查被阻止函数的返回代码)和2)创建一个“终止文件描述符”,它也传递给select()或poll()函数,关闭它或在另一个线程中写入它。
祝你好运。