pthread_mutex_lock的thread特性

作者:gfree.wind@gmail.com
博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net
微博:weibo.com/glinuxer
QQ技术群:4367710

前几天写了一段示例代码,想说明一下可重入函数。所以我在一个函数中使用了pthread_mutex_lock,来说明一旦函数使用了锁,就变成了不可重入的函数。

#include
#include #include
#include
#include
#include static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;static const char * const caller[2] = {"main", "signal handler"};
static volatile int signal_handler_exit = 0;static void hold_mutex(int c)
{printf("enter hold_mutex [caller %s]\n", caller[c]);pthread_mutex_lock(&mutex);/* 保证信号函数退出前, main线程始终拥有锁 */while (!signal_handler_exit && c != 1) {sleep(5);}pthread_mutex_unlock(&mutex);printf("leave hold_mutex [caller %s]\n", caller[c]);
}static void signal_handler(int signum)
{hold_mutex(1);signal_handler_exit = 1;
}
int main()
{signal(SIGALRM, signal_handler);alarm(3);hold_mutex(0);return 0;
} .h>.h>.h>.h>.h>

上面代码很简单,main函数调用hold_mutex来持有锁。hold_mutex直到SIGALRM信号处理函数返回后,才会释放锁和退出。同时,main利用alarm,在3秒后可以收到信号SIGALRM,而SIGALRM的信号处理函数也会调用hold_mutex。

这就保证了,在main线程持有锁的过程中,通过信号处理机制,再次进入hold_mutex,来造成“死锁”的场景。用以说明hold_mutex是不可重入的。

可是运行结果让我很意外。。。

[fgao@fgao test]#./a.out
enter hold_mutex [caller main]
enter hold_mutex [caller signal handler]
leave hold_mutex [caller signal handler]
leave hold_mutex [caller main]
[fgao@fgao test]# 

这是怎么回事呢?为什么在main拿到锁以后,信号处理函数还是可以拿到锁呢?我决定在这样试一下,直接在hold_mutex中再次拿锁。 代码变成了下面这样:

#include
#include #include
#include
#include
#include static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;static void hold_mutex(int c)
{if (c == 0) {return;}printf("enter hold_mutex [caller %d]\n", c);pthread_mutex_lock(&mutex);hold_mutex(c-1);pthread_mutex_unlock(&mutex);printf("leave hold_mutex [caller %d]\n", c);
}int main()
{hold_mutex(3);return 0;
} .h>.h>.h>.h>.h>

执行结果如下:

[fgao@fgao test]#./a.out
enter hold_mutex [caller 3]
enter hold_mutex [caller 2]
enter hold_mutex [caller 1]
leave hold_mutex [caller 1]
leave hold_mutex [caller 2]
leave hold_mutex [caller 3]
[fgao@fgao test]# 

看到这样的结果,我首先想到难道pthread_mutex_lock是递归锁?但仔细想了想,又推翻了这个想法。递归锁是一种特殊的锁,不大可能会作为默认行为。

当我盯着pthread_mutex_lock这个名字,pthread这个关键字给我带来了提示。这个锁是否是跟线程相关呢?当该线程拥有了该锁后,可以继续上锁呢?

重读了一遍manual手册,证实了自己的想法。 The mutex object referenced by mutex shall be locked by calling pthreadmutexlock(). If the mutex is already locked, the calling thread shall block until the mutex becomes available. This operation shall return with the mutex object referenced by mutex in the locked state with the calling thread as its owner.

最后一句与我猜测的结果一样。虽然猜中了这个结果,但是我却没有一点兴奋,因为做Linux程序员已经有六、七年了,居然刚发现pthread_mutex_lock的这个特性。

pthread_mutex_lock的thread特性相关推荐

  1. mysql signal函数_使用signal函数

    scala中的部分应用函数和偏函数的区别 之前学习Scala编程语言时, 经常把部分应用函数(Partial Applied Function)和偏函数(Partial Function) 搞混. 这 ...

  2. Java15来了!!!一文详解JDK15新特性

    读懂JDK15新特性,这一篇就够了 一.Java历史简谈 二.我们该如何学习Java新特性 三.Java15新特性详解 特性一:密封类(语法层面) 特性二:instanceof 自动匹配模式(语法层面 ...

  3. Thread源码分析-java8

    1.Thread特性分析 守护线程Daemon 定性:支持性线程,主要用于程序中后台调度以及支持性工作. 当JVM中不存在Daemon线程时,JVM将会退出. 将一个线程设定为Daemon的方法: 调 ...

  4. 《POSIX多线程程序设计》读书笔记

    <POSIX多线程程序设计>读书笔记 一.      概述 1.    一个UNIX进程可以理解为一个线程加上地址空间.文件描述符和其他数据: 2.    多个线程可以共享一个地址空间,而 ...

  5. Odoo10参考系列--混合而有用的类

    Odoo实现了一些有用的类和混合,使您可以轻松地在对象上添加常用的行为.本指南将详细介绍其中的大部分内容,包括示例和用例. 消息特征 消息集成 基本消息系统 将消息功能集成到模型中非常容易.简单地继承 ...

  6. wifidog 整体分析

    想要实现让别人连上自己热点,就弹出定制化的页面,可以用wifidog来实现 这段时间把wifidog分析一篇,也终于集成到盒子上面去了,写了个比较粗糙的分析文档 框架 WIFIDOG整个框架分5部分: ...

  7. 测试sleep()和pthread_cond_timewait()之间的区别

    用来测试sleep()和pthread_cond_timewait()之间的区别 通过#if 0/1 来分别测试 当从终端输入q时,通过打印来判断是否可以立即返回结束线程,还是要等睡眠时间到了才能结束 ...

  8. C++11 新特性之std::thread

    C++11 新特性之std::thread 原文:https://blog.csdn.net/oyoung_2012/article/details/78958274 从C++11开始,C++标准库已 ...

  9. C++11新特性以及std::thread多线程编程

    一 .C++11新特性 1. auto 类型推导 1.1 当=号右边的表达式是一个引用类型时,auto会把引用抛弃,直接推导出原始类型: 1.2 当=号右边的表达式带有const属性时,auto不会使 ...

最新文章

  1. java 内部类的理解
  2. python中函数的作用域_Python中的函数作用域
  3. 学生时代,我做过最有价值的事是什么?
  4. 怎样安装python在桌面_在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程...
  5. Nodejs 新特性 async await 的使用 以及使用 async await 处理异步
  6. HDU-Largest Rectangle in a Histogram-1506 单调栈
  7. 程序员的目标应该是向牛人看齐而不是当经理或者赚大钱
  8. 联想笔记本linux无线网卡驱动下载,联想无线网卡驱动下载-联想 X1 Carbon网卡驱动下载v18.40.0 官方最新版-西西软件下载...
  9. Arccatalog连接到postgresql失败问题
  10. ACM的奇计淫巧_输入挂
  11. webgis中等值面生成技术之-arcgis 用自带工具生成等值面并其发布成gp服务
  12. 天使投资、风险投资VC、私募基金PE 与“A轮、B轮、C轮融资”的关系
  13. vue版分享微博 分享微信 分享qq |亲测有效|2020年08月13日
  14. git+commitize+cz-customizable 代码 提交规范
  15. linux部署nestjs项目
  16. django文件上传功能的实现
  17. 亲测无限坐席在线客服系统源码,基于ThinkPHP的一款在线客服系统源码
  18. 卡西欧计算机程序,卡西欧计算器编程计算示例
  19. 工业路由器下的智慧园林监测解决方案
  20. 超轻量级的Gow,替代cgwin

热门文章

  1. 如何在大一时候系统学习编程?
  2. Hyper-V 3.0实用技巧:创建虚拟机组快照
  3. [BZOJ 3211]花神游历各国(并查集+树状数组)
  4. spring包镜像下载地址
  5. error 图片,加载错误-》实用笔记
  6. 复杂的数据类型5 - C++快速入门11
  7. OneGame V1.0.2 发布,让运营游戏不再是梦想
  8. Linux 第60,61天 ansible的playbook
  9. 危害企业IT系统最严重的五个安全威胁
  10. Android Studio 中删除项目和项目找回------ Project Structure的使用