C语言多线程编程:pthread_cancel 线程取消函数详解

本文将通过一个简单的示例代码,详细解释 C 语言中使用 pthread_cancel 函数取消线程的机制,以及 pthread_cleanup_pushpthread_cleanup_pop 函数的作用。

代码示例:

void fun1(void *arg)
{
    // 释放资源的代码
    // 解锁
    printf('........\n');
}

// 线程执行函数
void *routine(void *arg)
{
    // 线程取消函数触发
    pthread_cleanup_push(fun1, NULL);

    for (int i = 0; i < 10; ++i)
    {
        sleep(1);
        printf('i = %d\n', i);
    } // 任务完成

    pthread_cleanup_pop(0);

    pthread_exit(NULL);

}

int main(int argc, char const *argv[])
{
    pthread_t tid;

    pthread_create(&tid, NULL, &routine, NULL);

    sleep(3);
    pthread_cancel(tid);

    printf(',,,,,,\n');

    pthread_join(tid, NULL);

    return 0;
}

代码解释:

  1. 创建线程:
  • pthread_create(&tid, NULL, &routine, NULL):创建了一个新的线程,线程 ID 为 tid,执行函数为 routine
  1. 线程取消函数:
  • pthread_cleanup_push(fun1, NULL):在 routine 函数中,使用 pthread_cleanup_push 函数注册 fun1 函数为线程取消函数,当线程被取消时,会自动调用 fun1 函数执行。
  • fun1 函数用于释放资源、解锁等操作,确保线程在取消时能够正常清理资源。
  1. 线程执行:
  • routine 函数中的 for 循环模拟了线程执行的任务,每秒打印 i 的值。
  1. 取消线程:
  • sleep(3):主线程休眠 3 秒。
  • pthread_cancel(tid):主线程调用 pthread_cancel 函数取消线程 tid 的执行。
  1. 清理资源:
  • pthread_cleanup_pop(0):在 routine 函数中,使用 pthread_cleanup_pop(0) 函数将 fun1 函数从线程取消函数栈中弹出,表明 fun1 函数已经执行完毕。
  1. 等待线程结束:
  • pthread_join(tid, NULL):主线程调用 pthread_join 函数等待线程 tid 结束,并获取线程的返回值。

执行结果:

i = 0
i = 1
i = 2
........
,,,,,,,

结果分析:

  • 线程执行了 3 次循环,打印了 i = 0i = 1i = 2
  • 随后,主线程调用 pthread_cancel 函数取消了线程 tid,导致 routine 函数被中断。
  • 由于 pthread_cleanup_push 函数注册了 fun1 函数为线程取消函数,因此 fun1 函数被自动调用,打印了 ........
  • 最后,主线程打印了 ,,,,,,

总结:

pthread_cancel 函数用于取消线程的执行,pthread_cleanup_pushpthread_cleanup_pop 函数用于在线程取消时自动调用指定的清理函数。该机制可以确保线程在取消时能够正常清理资源,避免出现内存泄漏或其他问题。

C语言多线程编程:pthread_cancel 线程取消函数详解

原文地址: https://www.cveoy.top/t/topic/qDzp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录