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 关闭,我希望它失败)。我在网上查看了其他问题,但似乎找不到我的特定问题的答案。
有任何想法吗?谢谢
同一程序的不同线程共享内存,包括文件描述符表。如果一个线程关闭了 FD,那么所有其他线程也会关闭该 FD。这是使用多线程和使用多进程之间的区别之一。因此,不允许一个线程关闭另一个线程依赖于保持打开状态的文件描述符。
然而,更一般地说,您必须非常小心地修改共享数据。一般来说,您必须通过信号量、条件变量或其他对同步有意义的构造或操作来同步访问。否则程序行为没有明确定义。特别是,您不能期望关闭文件描述符会导致在不同线程中运行的活动 I/O 函数终止。相反,向目标线程发送信号。