问题:

有一个进程,创建了2个线程,线程A和线程B,线程A与线程B都需要访问某一资源。

所以在进程中初始化了一个pthread_mutex_t变量resMutex;

pthread_mutex_init(&resMutex, NULL);

线程A的工作:

for (i=0;i<100;i++)

{

pthread_mutex_lock(&resMutex);

use resource

pthread_mutex_unlock(&resMutex);

}

线程B平时读消息队列,收到消息后执行一次如下操作:

pthread_mutex_lock(&resMutex);

use resource

pthread_mutex_unlock(&resMutex);

发现执行情况:

线程A lock mutex

线程A 访问资源

线程B lock mutex 阻塞

线程A unlock mutex

线程A lock mutex

线程A 访问资源

线程A unlock mutex

...

线程A的工作执行完,最后一次unlock mutex

线程B lock mutex 成功返回

线程B 访问资源

线程B unlock mutex

就是线程A工作时,线程B一直抢占不到mutex。

查了下手册,默认的mutex类型应该是PTHREAD_MUTEX_TIMED_NP,按手册来说,这种锁当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。

线程A加锁后,只有线程B请求锁,那么为什么线程A解锁后,线程B并没有马上得到锁,而是线程A下一循环周期的加锁请求又得到锁了呢?

然后我尝试了一下,在线程A解锁后加了一点延时,线程B就能够在线程A本周期解锁后得到锁了。

A线程持续持有资源

求解

理解解释:

服务器死了 又得重写一遍。。

自己实验了下 当i==10000的时候才会出现明显的线程切换现象。

猜想: 

当A线程放弃资源之前,会告诉内核,然后内核查看申请队列。如果是空,就继续让A持有资源。

如果有线程申请该资源,A线程会放弃该资源。但这是个漫长的过程。

因此在这个过程中,A继续能获得B资源。

当过了N年之后,线程B知道了  ,A资源已经跟A线程分离了 才能趁虚而入。

线程调度基本上有两种 1是先来先服务 2是优先级高的先服务。明显这里 用的是先来先服务。 但是B线程一直没有得到内核发出的A资源已经可以被使用的信号。所以A资源占了点便宜。能够继续占有资源。  cpu处理跟IO设备的时间差,才是操作系统存在的根本原因。时间差是王道啊。

我的理解:

A设备解锁,内核发布告诉申请这个资源的线程们,这个资源可以抢了.原则:先来先服务.

然后A/B开始抢资源,资源A设备刚用完,还在A设备手上.所以A设备立即抢,时间花费极小;

但是B从收到抢的信号到开始抢,需要花费一定的时间,肯定抢不过A设备的.

所以A理所当然的把资源抢到了,然后加锁,内核就宣布本回合结束.资源被A设备抢到,A设备可以用,其他设备等待.

所以B就不抢了,继续等待如此循环下去了….所以A一直占用资源,B一直抢不到.

来自 <https://bbs.csdn.net/topics/360180262>

mutex的加锁与解锁问题相关推荐

  1. 分析为什么加锁和解锁操作是原子的

    临界资源:多线程执行流共享的资源就叫做临界资源. 临界区:每个线程内部,访问临界自娱的代码,就叫做临界区. 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用 ...

  2. java队列加锁_java并发-----浅析ReentrantLock加锁,解锁过程,公平锁非公平锁,AQS入门,CLH同步队列...

    前言 为什么需要去了解AQS,AQS,AbstractQueuedSynchronizer,即队列同步器.它是构建锁或者其他同步组件的基础框架(如ReentrantLock.ReentrantRead ...

  3. ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述)

    - title: ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述) - date: 2021/8/16 文章目录 一.ReentrantLock 1. 构造函数 二.Reentr ...

  4. 使用redis的setnx可以非同一线程进行加锁和解锁(附源码)

    使用redis的setnx可以非同一线程进行加锁和解锁(附源码) 问题背景 项目搭建 总结 Lyric: 那在终点之前 问题背景 Redisson做分布式锁是目前比较流行的方式,但是在使用的过程中遇到 ...

  5. mysql数据库加锁语句_sql语句对数据库表进行加锁和解锁

    锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性. 我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象.即如果没有锁定且多个用户同时访问一个数据库 ...

  6. UNIX操作系统中加锁和解锁

    Unix操作系统加锁和解锁的基本思想是,当某个进程进入临界区,它将持有一个某种类型的锁(UNIX里一般来说是semaphore,Linux里一般是信号量和原子量或者spinlock).当其他进程在该进 ...

  7. 加锁和解锁-ReentrantLock详解-AQS-并发编程(Java)

    文章目录 1 AQS 1.1 概念 1.2 两种锁机制 1.3 公平锁和非公平锁 1.3 锁竞争 1.4 条件变量 2 ReentrantLock 2.1 简介 2 加锁 2.1 加锁成功 2.2 加 ...

  8. IMX6UL eMMC加锁和解锁代码分析与实现

    背景 最近在使用eMMC作为外部存储设备过程中,出现eMMC两个分区数据全部被清空,文件系统数据和用户数据全部为0 ,在网上看到一篇文件说对eMMC加锁后强制解锁会清除用户数据,这样达到的效果与我遇到 ...

  9. 【图解】一篇搞定ReentrantLock的加锁和解锁过程

    文章目录 1. 概述 2. AbstractQueuedSynchronizer(AQS) 3. 加锁 4. 解锁 5. 公平锁和非公平锁的区别 1. 概述 本文主要结合图片分析ReentrantLo ...

最新文章

  1. vs code golang代码自动补全
  2. 好用的 Markdown 编辑器 Typora【Window 、Linux 下的安装教程】
  3. 1211笔记关于//modal//更改窗口的根控制器//数据存取//Plist属性列表//-“沙盒机制”//plis属性列表//偏好设置//归档普通对象//联系人数据存储//协议与回调函数...
  4. linux下导入mysql表乱码_在linux下导入.sql文件,数据库中文乱码
  5. python遍历txt每一行_python – 计算(和写入)文本文件中每一行的...
  6. 10 个理由让你继续干 IT
  7. 【Pytorch神经网络理论篇】 12 卷积神经网络实现+卷积计算的图解
  8. android tab 切换动画,Android之ViewPager+TabLayout组合实现导航条切换效果(微信和QQ底部多标签切换)...
  9. 信息学奥赛一本通 1013:温度表达转化 | OpenJudge NOI 1.3 08
  10. 框架页面中,从子页面刷新父页面问题解决
  11. 说说我心中的Linux系统
  12. android xml图片旋转,如何在Android中进行平滑的图像旋转?
  13. 深度优先搜索(DFS)
  14. oracle varchar2 转换成date,将Oracle VARCHAR2转换为DATE并排除无效数据
  15. leetcode 927. 三等分
  16. Spark面试近300题初始版本
  17. 保险合同的订立,生效与履行
  18. C语言if( x)的意思,c语言中if(x)是什么意思?_后端开发
  19. 智能网联汽车——深度学习与无人驾驶(一)
  20. 电源学习(1):stm32单片机buck电路可调电源设计介绍

热门文章

  1. Faster-RCNN的一些记录。
  2. JavaScript学习笔记:你必须要懂的原生JS(一)
  3. qs.stringify和JSON.stringify的使用和区别
  4. 今天在cnblog开博啦
  5. 用代码创建工程并添加内容
  6. stm32 中bootloader、startup_stm32f10x_md.s的作用
  7. java 下载url图片_java下载url图片链接
  8. 【Python】牛客的输入输出到底怎么整??
  9. 【Matlab】编译器和工作区等窗口怎么调整位置?
  10. 【实操】看了太多公式概念?你该学会怎么用T检验了!