一个线程可以调用pthread_cancel终止同一进程中的另一个线程,但是值得强调的是:同一进程的线程间,pthread_cancel向另一线程发终止信号。系统并不会马上关闭被取消线程,只有在被取消线程下次系统调用时,才会真正结束线程。或调用pthread_testcancel,让内核去检测是否需要取消当前线程。被取消的线程,退出值,定义在Linux的pthread库中常数PTHREAD_CANCELED的值是-1。
-
-
-
int pthread_cancel(pthread_t thread);
看下面程序:
-
-
-
-
void *thread_fun(void *arg)
-
{
-
int i= 1;
-
printf( "thread start \n");
-
while( 1)
-
{
-
i++;
-
}
-
return ( void *) 0;
-
}
-
int main()
-
{
-
void *ret= NULL;
-
int iret= 0;
-
pthread_t tid;
-
pthread_create(&tid, NULL,thread_fun, NULL);
-
sleep( 1);
-
-
pthread_cancel(tid); //取消线程
-
pthread_join(tid, &ret);
-
printf( "thread 3 exit code %d\n", ( int)ret);
-
-
return 0;
-
-
}
会发现程序再一直运行,线程无法被取消,究其原因pthread_cancel向另一线程发终止信号。系统并不会马上关闭被取消线程,只有在被取消线程下次系统调用时,才会真正结束线程。如果线程里面没有执行系统调用,可以使用pthread_testcancel解决。
-
-
-
-
void *thread_fun(void *arg)
-
{
-
int i= 1;
-
printf( "thread start \n");
-
while( 1)
-
{
-
i++;
-
pthread_testcancel();
-
}
-
return ( void *) 0;
-
}
-
int main()
-
{
-
void *ret= NULL;
-
int iret= 0;
-
pthread_t tid;
-
pthread_create(&tid, NULL,thread_fun, NULL);
-
sleep( 1);
-
-
pthread_cancel(tid); //取消线程
-
pthread_join(tid, &ret);
-
printf( "thread 3 exit code %d\n", ( int)ret);
-
-
return 0;
-
-
}