我在Linux(CentOS 5.3)上有一个C ++程序,它产生多个线程,这些线程处于无限循环中,以执行工作并在特定的时间内hibernate。现在,我必须取消正在运行的线程,以防出现新的配置通知并重新启动新的线程集,为此我使用了pthread_cancel。我观察到的是,即使收到取消指示,线程也不会停止,甚至在完成睡眠后也会出现一些睡眠线程。
由于不希望出现这种行为,因此在上述情况下使用pthread_cancel会引发有关是好做法还是坏做法的问题。
请在上述情况下对pthread_cancel用法进行评论。
通常,取消线程并不是一个好主意。只要有可能,最好有一个共享标志,线程可以使用它来跳出循环。这样,您将让线程执行在实际退出之前可能需要执行的任何清理。
在没有真正取消线程的问题上,POSIX规范确定了一组取消点(man 7 pthreads)。只能在这些点取消线程。如果您的无限循环不包含取消点,则可以通过调用来添加一个pthread_testcancel。如果pthread_cancel已被调用,则此时将对其执行操作。
pthread_testcancel
pthread_cancel