C语言多线程编程:pthread_cancel 线程取消函数详解
C语言多线程编程:pthread_cancel 线程取消函数详解
本文将通过一个简单的示例代码,详细解释 C 语言中使用 pthread_cancel 函数取消线程的机制,以及 pthread_cleanup_push 和 pthread_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;
}
代码解释:
- 创建线程:
pthread_create(&tid, NULL, &routine, NULL):创建了一个新的线程,线程 ID 为tid,执行函数为routine。
- 线程取消函数:
pthread_cleanup_push(fun1, NULL):在routine函数中,使用pthread_cleanup_push函数注册fun1函数为线程取消函数,当线程被取消时,会自动调用fun1函数执行。fun1函数用于释放资源、解锁等操作,确保线程在取消时能够正常清理资源。
- 线程执行:
routine函数中的for循环模拟了线程执行的任务,每秒打印i的值。
- 取消线程:
sleep(3):主线程休眠 3 秒。pthread_cancel(tid):主线程调用pthread_cancel函数取消线程tid的执行。
- 清理资源:
pthread_cleanup_pop(0):在routine函数中,使用pthread_cleanup_pop(0)函数将fun1函数从线程取消函数栈中弹出,表明fun1函数已经执行完毕。
- 等待线程结束:
pthread_join(tid, NULL):主线程调用pthread_join函数等待线程tid结束,并获取线程的返回值。
执行结果:
i = 0
i = 1
i = 2
........
,,,,,,,
结果分析:
- 线程执行了 3 次循环,打印了
i = 0、i = 1和i = 2。 - 随后,主线程调用
pthread_cancel函数取消了线程tid,导致routine函数被中断。 - 由于
pthread_cleanup_push函数注册了fun1函数为线程取消函数,因此fun1函数被自动调用,打印了........。 - 最后,主线程打印了
,,,,,,。
总结:
pthread_cancel 函数用于取消线程的执行,pthread_cleanup_push 和 pthread_cleanup_pop 函数用于在线程取消时自动调用指定的清理函数。该机制可以确保线程在取消时能够正常清理资源,避免出现内存泄漏或其他问题。
原文地址: https://www.cveoy.top/t/topic/qDzp 著作权归作者所有。请勿转载和采集!