什么时候使用pthread_cancel
而不是pthread_kill
?
答案 0 :(得分:32)
我不会同时使用这两种,但这只是个人偏好。
在这两个中,pthread_cancel
是最安全的终止线程,因为线程只有在使用pthread_setcancelstate()
将其可取消性状态设置为true时才会受到影响。
换句话说,在以可能导致死锁的方式保存资源时,它不应该消失。 pthread_kill()
调用会向特定线程发送信号,这是一种异常影响线程的方法,原因不是取消它。
我的大多数线程都倾向于在循环中进行工作并定期检查标志以查看它们是否应该退出。这主要是因为我在pthread_kill()
危险且pthread_cancel()
不存在的世界中长大。
我赞同这样的理论:每个线程应该完全控制自己的资源,包括其执行生命周期。我总是发现这是避免死锁的最佳方法。为此,我只使用互斥锁进行线程之间的通信(我很少发现需要真正的异步通信)和一个用于终止的标志变量。
答案 1 :(得分:2)
你无法用pthread_kill()
“杀死”一个帖子。如果您尝试将SIGTERM
或SIGKILL
发送到pthread_kill()
的主题,则会终止整个过程。
我赞同这样的理论:PROGRAMMER而不是THREAD(也不是API设计者)应该在所有方面完全控制自己的软件,包括哪些线程取消哪个。
我曾经在一家公司工作过,我们开发了一个服务器,它使用一个工作线程池和一个特殊的主线程,负责在任何时候创建,挂起,恢复和终止工作线程。当然线程使用了某种同步,但它是我们的设计,而不是一些API强制的教条。该系统运作良好,效率很高!
这是在Windows下。然后我尝试将它移植到Linux上,我偶然发现了pthreads'愚蠢的'理论“关于暂停另一个线程等的错误。所以我不得不放弃pthread并直接使用本机Linux系统调用(clone()
)为我们的服务器实现线程。