操作系统:Windows。 语言:C
我有一个线程通过TCP向服务器发送请求,并在信号量上无限期等待响应。还有另一个线程读取套接字,将接收到的数据复制到公共缓冲区中,并使信号脉冲,以便从等待中退出。这一切都很好。但是在由于某种原因导致进程被终止的情况下,等待信号量的线程会等待其他线程终止。
为什么线程等待信号量在进程被终止时不会结束?我在Linux论坛上看到SEM_UNDO在这种情况下有所帮助。 Windows上有类似的东西吗?任何解决方法?
答案 0 :(得分:7)
Semaphores do not have owners。如果你等待信号量,那么你正在等待任何人发出信号。没有办法宣布“这个人有责任发出信号,并且如果他没有发出信号就终止了,那么我应该做点什么来恢复。”
如果需要所有者可跟踪的同步对象,请使用互斥锁。或者,您可以让服务员等待其他进程句柄并在检测到其他进程已终止时执行恢复。
答案 1 :(得分:2)
当进程终止时(与TerminateProcess一样),此进程中的所有线程也将终止。没有例外。这就是系统的工作原理。如果某个线程仍处于活动状态,那么这自动意味着它的进程也处于活动状态。所以,你所看到的与你所看到的不同。要验证该进程是否真的“被杀死”(或在Windows世界中终止),请使用“任务管理器和进程”选项卡。