4

可能重复:
杀死 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;
}
4

2 回答 2

12

您可以使用pthread_cancel()杀死一个线程:

int pthread_cancel(pthread_t thread);

请注意,线程可能没有机会进行必要的清理,例如释放锁、释放内存等。所以您应该首先使用pthread_cleanup_push()添加将在线程取消时调用的清理函数。从 man pthread_cleanup_push(3)

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

关于是否阻塞线程是否会被取消的问题,并不能保证,注意手册中也提到了这一点:

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

所以这意味着唯一保证的行为是线程将在调用pthread_cancel().

注意:如果您无法更改线程代码以添加清理处理程序,那么您唯一的其他选择是使用pthread_kill() 终止线程,但是由于上述原因,这是一种非常糟糕的方法。

于 2012-11-08T08:45:53.557 回答
4

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

于 2012-11-08T09:15:53.547 回答