【pthread

您所在的位置:网站首页 linux结束线程函数 【pthread

【pthread

2023-10-09 08:00| 来源: 网络整理| 查看: 265

文章目录 pthread_cancel()函数是什么?1、pthread_cancel() 函数生效,代码演示:2、pthread_cancel() 函数不生效,代码演示总结

pthread_cancel()函数是什么?

线程结束执行的方式共有 3 种,分别是: 1.线程将指定函数体中的代码执行完后自行结束; 2.线程执行过程中,遇到 pthread_exit() 函数结束执行。 3.线程执行过程中,被同一进程中的其它线程(包括主线程)强制终止;

第一种方式:很容易理解,就是函数内所有代码执行完毕后,线程主动结束。第二种方式:已经在《pthread_exit()函数》一节中做了详细的介绍。第 3 种方式:本节给大家重点介绍,多线程程序中,一条线程可以借助 pthread_cancel() 函数向另一条线程发送“终止执行”的信号(后续称“Cancel”信号),从而令目标线程结束执行。

pthread_cancel() 函数声明在头文件中,语法格式如下:

int pthread_cancel(pthread_t tid); //向 tid 目标线程发送 Cancel 信号

如果 pthread_cancel() 函数成功地发送了 Cancel 信号,返回数字 0;反之如果发送失败,函数返回值为非零数。对于因“未找到目标线程”导致的信号发送失败,函数返回 ESRCH 宏(定义在头文件中,该宏的值为整数 3)。

注意,pthread_cancel() 函数的功能仅仅是向目标线程发送 Cancel 信号,至于目标线程是否处理该信号以及何时结束执行,由目标线程决定。

对于接收 Cancel 信号后结束执行的目标线程,等同于该线程自己执行如下语句:

pthread_exit(PTHREAD_CANCELED);

也就是说,当一个线程被强制终止执行时,它会返回 PTHREAD_CANCELED 这个宏(定义在头文件中)。

1、pthread_cancel() 函数生效,代码演示: #include #include #include // sleep() 函数 //创建一个互斥量 pthread_mutex_t mutex; //线程执行的函数 void * thread_func1(void * arg) { printf("新建线程开始执行.....\n"); //加锁 pthread_mutex_lock(&mutex); printf("新建线程执行中.....\n"); sleep(10); //在系统调用sleep()时设置一个取消点(cancelpoint),线程将会从这里直接退出 //解锁 pthread_mutex_unlock(&mutex); printf("新建线程执行完毕.....\n"); } int main() { pthread_t myThread; void * mess; int value; int res; //初始化互斥量 pthread_mutex_init(&mutex, NULL); //创建 myThread 线程 res = pthread_create(&myThread, NULL, thread_func1, NULL); if (res != 0) { printf("线程创建失败\n"); return 0; } sleep(1); //向 myThread 线程发送 Cancel 信号 res = pthread_cancel(myThread); if (res != 0) { printf("终止 myThread 线程失败\n"); return 0; } //获取已终止线程的返回值 res = pthread_join(myThread, &mess); if (res != 0) { printf("等待线程失败\n"); return 0; } //如果线程被强制终止,其返回值为 PTHREAD_CANCELED if (mess == PTHREAD_CANCELED) { printf("myThread 线程被强制终止\n"); } else { printf("error\n"); } //释放互斥量资源 pthread_mutex_destroy(&mutex); return 0; }

假设程序编写在 pthread_cancel.c 文件中,执行过程为:

[root@localhost ~]# gcc pthread_cancel.c -o thread -lpthread [root@localhost ~]# ./thread 新建线程开始执行… 新建线程执行中… myThread 线程被强制终止

*注意:thread_func1()函数内加了互斥锁,但是并没有解锁线程就直接退出了,这就导致了死锁。这就是我想提醒大家使用 pthread_cancel()函数时需要重点关注的地方。

2、pthread_cancel() 函数不生效,代码演示 #include #include #include // sleep() 函数 //创建一个互斥量 pthread_mutex_t mutex; //线程执行的函数 void * thread_func2(void * arg) { printf("新建线程开始执行.....\n"); //加锁 pthread_mutex_lock(&mutex); printf("新建线程执行中.....\n"); //sleep(10); //函数内没有系统调用,故没有设置一个取消点(cancelpoint),线程将不会退出而是继续往下执行代码 //解锁 pthread_mutex_unlock(&mutex); printf("新建线程执行完毕.....\n"); } int main() { pthread_t myThread; void * mess; int value; int res; //初始化互斥量 pthread_mutex_init(&mutex, NULL); //创建 myThread 线程 res = pthread_create(&myThread, NULL, thread_func2, NULL); if (res != 0) { printf("线程创建失败\n"); return 0; } sleep(1); //向 myThread 线程发送 Cancel 信号 res = pthread_cancel(myThread); if (res != 0) { printf("终止 myThread 线程失败\n"); return 0; } //获取已终止线程的返回值 res = pthread_join(myThread, &mess); if (res != 0) { printf("等待线程失败\n"); return 0; } //如果线程被强制终止,其返回值为 PTHREAD_CANCELED if (mess == PTHREAD_CANCELED) { printf("myThread 线程被强制终止\n"); } else { printf("error\n"); } //释放互斥量资源 pthread_mutex_destroy(&mutex); return 0; }

假设程序编写在 pthread_cancel.c 文件中,执行过程为:

[root@localhost ~]# gcc pthread_cancel.c -o thread -lpthread [root@localhost ~]# ./thread 新建线程开始执行… 新建线程执行中… 新建线程执行完毕… 终止 myThread 线程失败

*注意:thread_func2()函数没有按照预想的方式直接退出。

总结

大家发现没? 1.pthread_cancel()函数不是直接使得目标线程退出的,而是在系统调用中设置一个取消点(cancelpoint),当有系统调用函数时就会检查是否设置了这个cancelpoint,如果设置了就立即退出线程,否则不退出。 2.sleep()函数属于系统调用,当使用了sleep()时系统就会检查cancelpoint,这时就会让目标线程直接退出。但是在thread_func2()函数中没有系统调用函数,而是我们自己编写的C代码,所以不会设置这个cancelpoint,故不会退出线程。

感谢以下博主提供思路: 1.pthread_cancel()函数:终止线程执行 2.线程退出函数pthread_cancel() 采坑点



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3