📜  C中的pthread_cancel()示例(1)

📅  最后修改于: 2023-12-03 15:30:14.500000             🧑  作者: Mango

C中的pthread_cancel()示例

简介

在多线程程序中,有时候需要提前结束某个线程的执行, 在 C 语言的 POSIX 线程库中,提供了一种叫做 pthread_cancel() 的函数,可以用来中止指定线程。

函数定义
#include <pthread.h>

int pthread_cancel(pthread_t thread);

pthread_cancel() 函数会请求取消指定线程 thread 的执行。调用该函数后,线程 thread 将立即响应取消请求,并退出线程的执行。但是,线程终止的具体时间是不确定的,可能需要一定的时间才能真正终止。

函数参数
  • thread : 需要被取消的线程。
函数返回值
  • 成功:0;
  • 失败:非 0 值,具体错误码可以在 errno 中查看。
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

void *thread_func(void *arg)
{
    int i;

    for (i = 0; i < 10; i++) {
        printf("Thread running: %d\n", i);
        sleep(1);
    }

    pthread_exit(NULL);
}

int main()
{
    pthread_t tid;

    if (pthread_create(&tid, NULL, thread_func, NULL) != 0) {
        printf("Create thread error.\n");
        exit(1);
    }

    sleep(5);
    printf("Main thread stop the sub thread.\n");
    pthread_cancel(tid);

    pthread_join(tid, NULL);

    return 0;
}

代码说明:

  1. 创建一个新线程,打印 0-9 的数字,每个数字之间停顿 1 秒;
  2. 等待 5 秒钟后,调用 pthread_cancel() 终止线程执行;
  3. 最后调用 pthread_join() 等待子线程结束。

代码运行结果:

Thread running: 0
Thread running: 1
Thread running: 2
Thread running: 3
Thread running: 4
Main thread stop the sub thread.

可以看出,主线程在运行了 5 秒钟后,发出了取消子线程的请求,子线程在收到请求后,立刻响应并退出了执行。

总结

pthread_cancel() 函数是一个非常有用的函数,可以帮助我们优雅的结束一个线程的执行。但是,需要注意的是,它并不会强制中断线程的执行,线程的终止时间可能需要一定时间。此外,在线程终止时,需要考虑释放线程所占用的资源,否则可能会出现资源泄漏的情况。