【发布时间】:2012-01-01 02:39:20
【问题描述】:
操作系统:Windows。 语言:C
我有一个线程通过 TCP 向服务器发送请求,并在信号量上无限等待响应。还有另一个线程读取套接字,将接收到的数据复制到一个公共缓冲区中,并脉冲信号量以退出等待。这一切都很好。但是在进程由于某种原因被终止的情况下,等待信号量的线程会一直等待,而其他线程会终止。
当进程被杀死时,为什么线程等待信号量没有结束?我在 Linux 论坛上读到 SEM_UNDO 在这种情况下会有所帮助。 Windows上有类似的东西吗?有什么解决办法吗?
【问题讨论】:
-
您是如何创建线程 _beginthread 或 _beginthreadex 的?
-
只需让其他进程创建信号量即可。因此,当杀死进程会破坏它时,您会得到 WAIT_ABANDONED。
-
@HansPassant - 一定有其他事情发生。 Windows 不关心进程终止时线程处于什么状态 - 进程中的所有线程都已停止。 MSDN 说:'如果一个线程正在等待一个内核对象,在等待完成之前它不会被终止。这可能会导致应用程序挂起。根据经验,在 W95 以来的每个 Windows 上,这都是不正确的 - 等待信号量的线程不会阻止应用程序自行关闭(ExitProcess)或被终止(TerminateProcess)。
-
@Martin - Exit/TerminateProcess 没有什么好处,线程在没有追索权的情况下被杀死。在任何 C 或 C++ 程序中都可见,它在 main() 函数返回时结束,与线程无关。
-
@HansPassant - 对,那么为什么 OP 有这个问题?为什么OP进程不会终止?
标签: c windows multithreading semaphore freeze