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