我有一个我创建的pthread,现在我希望在特定的时间间隔内线程执行一些代码。但是用户也应该能够取消该线程。如何取消线程并确保线程在执行代码时不被取消?
在Java中,您可以使用
处理此问题while(!isInterrupted)
pthreads是否有类似的解决方案。
答案 0 :(得分:4)
在问题的示例代码中,您正在检查某个变量。这是不用于中断Java中线程的正常模式。
在Java中,您通过调用interrupt()
方法来中断线程。
然后线程检查它是否在IO和系统调用中被中断(当发生这种情况时可以抛出InterruptedException
;这意味着正在休眠或等待IO的线程在被中断时可以被唤醒)或者通过采样isInterrupted()
标志(通常用于循环中的条件,如问题中)。
区别很重要;检查你声明的一些标志变量只能在循环和你自己的代码中; Java中断系统适用于所有线程和所有非CPU阻塞代码,而无需程序员的特别努力。
Pthreads 的pthread_cancel()
模式与Java中断模式类似。
答案 1 :(得分:3)
pthread_cancel
可用于发送取消请求:
由
pthread_setcanceltype(3)
确定的线程取消类型可能是 异步或延迟(新线程的默认值)。异步 可取消性意味着线程可以随时取消(通常 立即,但系统不保证这一点)。延迟可取消性 意味着取消将被延迟,直到线程下一次调用函数 这是一个取消点。可能或可能的功能列表 取消点在pthreads(7)
中提供。由
pthread_setcancelstate(3)
确定的线程的可取消状态可以 启用(新线程的默认值)或禁用。如果一个线程有 禁用取消,然后取消请求仍然排队等到 线程启用取消。如果一个线程已启用取消,那么它 可取消性类型决定何时取消。
答案 2 :(得分:2)
所以有几种选择:
1:值检查(效果很好,但你没有太多控制权)。
2:检查pthread_cancel联机帮助页,它符合严格的规则。
3:使用pthread_signal,首先需要阻止,而不是恢复信号。它与第二个选项有相同的问题。
我推荐的网站:http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
答案 3 :(得分:0)
没有特定的功能来取消线程你可以使用pthread_cancel
取消线程,如上所述(但我建议反对它,除非你知道你在做什么) ,你必须设置自己的计时器。但while(!isInterrupted)
是完全可以接受的方式。
基本上应该是这样的:
while(!isInterrupted)
{
// whatever you want to do
sleep(howLongYouWantToWait);
}
// clean up and exit the thread function here
并且在主线程中有一个全局(或其他,见下文)
volatile bool isInterrupted = false;
并在完成后将其设置为true
,如果您想等待线程完成,则设置为pthread_join
。
而不是全局,你可以使用类变量,或者传递给线程函数的标志指针,或者任何其他方式,global是最简单和最不可取的。
当然,如果你想在等待时取消线程,并且只有在完成整个循环后才取消它,那么你需要处理信号和其他东西,但我认为你不是寻找那个。