如何杀死正在运行的线程?

时间:2012-11-08 08:40:36

标签: c multithreading pthreads

  

可能重复:
  kill thread in pthread

这里有一个包含线程启动的源代码,然后一段时间后我想要杀死它。怎么做 ? 不对线程函数进行任何更改

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>

pthread_t test_thread;

void *thread_test_run (void *v) // I must not modify this function
{
    int i=1;
    while(1)
    {
       printf("into thread %d\r\n",i);
       i++; 
       sleep(1);
    }
    return NULL
}

int main()
{
    pthread_create(&test_thread, NULL, &thread_test_run, NULL);

    sleep (20);
    // Kill the thread here. How to do it?

   // other function are called here...

    return 0;
}

2 个答案:

答案 0 :(得分:10)

您可以使用pthread_cancel()来杀死一个帖子:

int pthread_cancel(pthread_t thread);

请注意,线程可能没有机会进行必要的清理,例如,释放锁,释放内存等等。因此,您应首先使用pthread_cleanup_push()添加将在调用时调用的清理函数线程被取消了。来自人pthread_cleanup_push(3)

  

这些函数操纵调用线程的堆栈   线程取消清理处理程序。 清理处理程序是一个   取消线程时自动执行的功能(或   在下面描述的各种其他情况下); 它可能,因为   例如,解锁互斥锁,以便其他线程可用   在这个过程中。

关于是否阻止线程被取消的问题,不保证,请注意手册中也提到:

  

线程的取消类型,由pthread_setcanceltype(3)决定,   可能是异步或延迟(new的默认值)   线程)即可。异步可取消性意味着该线程   可以随时取消(通常立即取消,但系统会这样做   不保证这个)。延迟可取消性意味着取消   将被延迟,直到线程下一次调用一个函数为a   取消点。

所以这意味着唯一的保证行为是在调用pthread_cancel()之后某个时刻线程将被取消。

注意: 如果你不能改变线程代码来添加清理处理程序,那么你唯一的另一个选择就是用pthread_kill()来杀死线程,但是由于上述原因,这是一个非常糟糕的方法。

答案 1 :(得分:3)

简短的回答是:在线程运行的代码的配合下,您可以使用它支持的任何方法终止它。如果没有线程运行的代码的合作,你甚至不应该尝试它。如果线程在你杀死时持有一个关键锁怎么办?如果线程分配了内存并且没有其他代码来释放该内存怎么办?