C ++ pthread - 如何取消线程?

时间:2011-12-07 08:31:48

标签: c++ multithreading pthreads

我有一个我创建的pthread,现在我希望在特定的时间间隔内线程执行一些代码。但是用户也应该能够取消该线程。如何取消线程并确保线程在执行代码时不被取消?

在Java中,您可以使用

处理此问题
while(!isInterrupted)

pthreads是否有类似的解决方案。

4 个答案:

答案 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,首先需要阻止,而不是恢复信号。它与第二个选项有相同的问题。

  • 使用pthreads cancel和signal只能在必须锁定的线程内工作。因此设置变量以启动信号块。解锁可以通过任何其他线程完成。
  • 使用互斥锁或信号量(pthread_mutex,pthread_semaphore)也可以这样做。

我推荐的网站: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是最简单和最不可取的。

当然,如果你想在等待时取消线程,并且只有在完成整个循环后才取消它,那么你需要处理信号和其他东西,但我认为你不是寻找那个。