背景

一个模块频繁启动退出会出现退出阻塞的问题!
因为有特殊业务用同事非阻塞库有问题,所以我暂时用线程阻塞加pthread_cancel强制退出;
肯定就是这个线程退出阻塞,加日志跟踪之。。
怀疑在pthread_join,测试发现阻塞在pthread_cancel!!

分析

基本概念
pthread_cancel调用并不等待线程终止,它只提出请求。线程在取消请求(pthread_cancel)发出后会继续运行,
直到到达某个取消点(CancellationPoint)。取消点是线程检查是否被取消并按照请求进行动作的一个位置.

测试伪代码

#include <unistd.h>
#include <sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<errno.h>
#include<malloc.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/ioctl.h>
#include<stdarg.h>
#include<fcntl.h>static int socket_fd;static void* pthread_func(void* arg)
{char buf[128] = {0};while(1){printf("read start \r\n");pthread_testcancel(); //阻塞时没有这行read(socket_fd, buf, 128);pthread_testcancel();//阻塞时没有这行printf("read end\r\n");}return NULL;
}int main(int argc, char const *argv[]) {socket_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); pthread_t tid;pthread_create(&tid, NULL, pthread_func, NULL);sleep(2);printf("pthread_cancel tid[%d]\r\n", tid);int ret = pthread_cancel(tid);printf("ret[%d]\r\n", ret);pthread_join(tid, NULL);printf("pthread_join\r\n");close(socket_fd);socket_fd = -1;return 0;
}

非必现问题,必须实际环境测试, read要有接收
本地read无数据接收时无法复现问题!

原因

根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及
read()、write()等会引起阻塞的系统调用都是Cancelation-point,而其他pthread函数都不会引起Cancelation动作。
但是pthread_cancel的手册页声称,由于LinuxThread库与C库结合得不好,因而目前C库函数都不是Cancelation-point;但CANCEL信号会使线程从阻塞的系统调用中退出,并置EINTR错误码,因此可以在需要作为Cancelation-point的系统调用前后调用pthread_testcancel(),从而达到POSIX标准所要求的目标.
即如下代码段:
pthread_testcancel();
retcode = read(fd, buffer, length);
pthread_testcancel();

注意:
程序设计方面的考虑,如果线程处于无限循环中,且循环体内没有执行至取消点的必然路径,则线程无法由外部其他线程的取消请求而终止。因此在这样的循环体的必经路径上应该加入pthread_testcancel()调用.

真相大白:
pthread_cancel的手册页声称:LinuxThread库与C库结合得不好,C库函数都不是Cancelation-point, 需要作Cancelation-point的系统调用前后调用pthread_testcancel(),从而达到POSIX标准所要求的目标

参考

线程取消(pthread_cancel)


著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处!
更多精彩内容,欢迎访问一只海星的主页

pthread_cancel 线程阻塞问题相关推荐

  1. weblogic线程阻塞性能调优(图解)

    转自:http://blog.csdn.net/z69183787/article/details/12647539 声明:出现这个问题有程序方面.网络方面.weblogic设置方面等等原因,此文章主 ...

  2. 如何查找历史线程阻塞原因_java并发编程-线程状态,线程阻塞方式,阻塞中的线程如何终止?...

    前面的例子通过volatile boolean来让任务终止,那么如果任务阻塞了? 如何终止它?本文来看下,参考think in java . 线程的状态 1.new:线程创建后的短暂状态,其分配系统资 ...

  3. JAVE SE 学习day_09:sleep线程阻塞方法、守护线程、join协调线程同步方法、synchronized关键字解决多线程并发安全问题

    一.sleep线程阻塞方法 static void sleep(long ms) Thread提供的静态方法sleep可以让运行该方法的线程阻塞指定毫秒,超时后线程会自动回到RUNNABLE状态,等待 ...

  4. 守护线程与线程阻塞的四种情况

    守护线程  Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的 ...

  5. 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )

    文章目录 一. NIO 原生 API 弊端 二. Netty 简介 三. Netty 架构 四. Netty 版本 五. Netty 线程模型 六. 阻塞 IO 线程模型 七. 反应器 ( React ...

  6. Java并发编程(4):守护线程与线程阻塞的四种情况

    守护线程 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的运 ...

  7. Silverlight+WCF 实战-网络象棋最终篇之非线程阻塞倒计时窗口(四)

    前言: 在前面的系列中,我们虽然完成了其大部分功能,但是,离正真运行,还是有一大段距离 当你F5运行时,在弹出对话框之后,如果你不即时点确定,或者上个WC回来之后,你会发现已经提示出错了 这节开始,我 ...

  8. 线程阻塞的概念 (Java 中的睡眠状态sleep 等待状态wait 礼让状态yield 自闭状态join suspend() 和 resume() )

    线程阻塞的概念: 线程阻塞通常是指一个线程在执行过程中暂停,以等待某个条件的触发. 参考文章1:什么是线程阻塞?为什么会出现线程阻塞? 参考文章2:线程阻塞

  9. 深入理解 Java 锁与线程阻塞

    相信大家对线程锁和线程阻塞都很了解,无非就是 synchronized, wait/notify 等, 但是你有仔细想过 Java 虚拟机是如何实现锁和阻塞的呢?它们之间又有哪些联系呢?如果感兴趣的话 ...

最新文章

  1. maven中打包项目为war包的pom.xml配置
  2. SQL语句技巧:查询时巧用OR实现逻辑判断
  3. MySQL数据库分表分区
  4. 数据机房局部过热与节能降耗解决方案
  5. 面向对象发牌Java_面向对象思路的斗地主发牌小程序
  6. 【Python面试】 说说Python模块主要分哪三类?
  7. 使用python读取txt坐标文件生成挖空矿山_探矿批量
  8. POJ2184 Cow Exhibition(DP:变种01背包)
  9. 大学计算机基础英语翻译,大学计算机基础 教学课件 978 7 302 21247 8 第7章 常用工具软件.pdf...
  10. Microsoft Loopback Adapter : Oracle 安装
  11. 手把手教你搭建LyncServer2013之部署边缘服务器(七)
  12. centos ip地址固定
  13. StringUtils.hasText()说明
  14. docker push received unexpected HTTP status: 503 Service Unavailable
  15. My Fifty-fifth Page - 子集 - By Nicolas
  16. JavaEE知识体系
  17. 飞利浦净化器还能走多远
  18. 秀米svg点击显示另一张图_这个svg也太好玩了吧,居然可以自动展开全文!
  19. 人品差的人,开口闭口都是这些话
  20. java正则表达式匹配任意中文_java匹配中文的正则表达式

热门文章

  1. 老人与海好词100英文带翻译_The_Old_Man_and_The_Sea_老人与海_中英文对照版_(good)
  2. Ruby on Rails 之旅(七)—— Ruby on Rails 入门(5)
  3. 什么是Cookie?怎样设置和读取Cookie?
  4. 2019小结,期待2020
  5. 全局钩子+正则表达式=后台自动获取扫描枪数据
  6. FPN:feature pyramid networks for object detection
  7. 数字媒体概论——2D图像图形
  8. linux内核 cpu io等待,linux系统调优之IO、cpu
  9. C++14学习记录:新语言功能特性
  10. Python函数部分2