文章目录

  • 前言
  • 一、PTHREAD_MUTEX_RECURSIVE
  • 二、为什么一定要同一个线程多次获得同一把锁?

前言

使用 pthread_mutexattr_settype(3C) 可用来设置互斥锁的 type 属性。
int pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type);


一、PTHREAD_MUTEX_RECURSIVE

描述:
如果线程在不首先解除锁定互斥锁的情况下尝试重新锁定该互斥锁,则成功锁定该互斥锁。与PTHREAD_MUTEX_NORMAL类型的互斥锁不同,对此类互斥锁进行重新锁定时不会产生死锁的情况。
多次锁定互斥锁需要相同次数的解除锁定才能释放该锁,然后其他线程才可以获取该互斥锁。如果线程尝试解除被其他线程锁定的互斥锁,则会返回错误。如果线程尝试解除未锁定的互斥锁,则会返回错误。

二、为什么一定要同一个线程多次获得同一把锁?

其实主要就是对于你的线程处理中会有一些比较复杂的代码逻辑过程,比如很多层的函数调用,而这些函数其实都需要进行加锁保护数据访问。
这样就可能会反复的多次加锁,因而用rlock就可以进行多次加锁,解锁,直到最终锁被释放
而如果用普通的lock,当你一个函数A已经加锁,它内部调用另一个函数B,如果B内部也会对同一个锁加锁,那么这种情况就也会导致死锁。而rlock可以解决这个问题
最典型的就是函数的递归调用

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
pthread_mutex_t mutex;
pthread_mutexattr_t attr;
void* func(void* arg){  if(*(char*)arg == '\0') return NULL;  pthread_mutex_lock(&mutex);       char* str = (char*)arg;  while(*str != '\0'){  fputc(*str, stdout);  str++;  }  fputc('\n', stdout);  func((char*)arg+1);  pthread_mutex_unlock(&mutex);         return NULL;
}
int main()
{int ret;if((ret = pthread_mutexattr_init(&attr)) != 0){fprintf(stderr,"create mutex attribute error.msg:%s",strerror(ret));exit(1);}pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);pthread_mutex_init(&mutex, &attr);pthread_t p1, p2;char str1[8], str2[8];sprintf(str1, "abcdefg");sprintf(str2, "1234567");if((ret = pthread_create(&p1, NULL, func, str1)) != 0){  fprintf(stderr, "create thread error. msg:%s", strerror(ret));  exit(1);  }if((ret = pthread_create(&p2, NULL, func, str2)) != 0){  fprintf(stderr, "create thread error. msg:%s", strerror(ret));  exit(1);  }pthread_join(p1, NULL); pthread_join(p2, NULL);
}

线程【3】- 多线程中PTHREAD_MUTEX_RECURSIVE的理解相关推荐

  1. 关于多线程中锁的理解

    2019独角兽企业重金招聘Python工程师标准>>> 在多线程中,锁是非常重要的一个东西. 在Java语言中,有对象和类之分,因此多线程的锁也可分为对象锁和类锁. 对象锁,顾名思义 ...

  2. linux系统如何查看是否是线程死锁,多线程中如何使用gdb精确定位死锁问题

    本文转载自微信公众号「程序喵大人」,作者程序喵大人 .转载本文请联系程序喵大人公众号. 在多线程开发过程中很多人应该都会遇到死锁问题,死锁问题也是面试过程中经常被问到的问题,这里介绍在c++中如何使用 ...

  3. mysql master线程 fork_多线程中fork的坑

    多线程中fork的坑 问题所在 在写oj的时候,由于使用了线程池,并且在获取用户程序运行结果的时候使用的是管道进行子进程的标准输出的获取, 最后带来了一个问题,就是发现本来线程池有5个任务,最后调试信 ...

  4. python多线程中join()的理解

    在 Python 的多线程编程中,经常碰到 thread.join()这样的代码.那么今天咱们用实际代码来解释一下 join 函数的作用. 第一,当一个进程启动之后,会默认产生一个主线程,因为线程是程 ...

  5. python 主程序等待 子线程_Python多线程中主线程等待所有子线程结束的方法

    Python多线程中主线程等待所有子线程结束的方法 发布时间:2020-07-30 14:39:04 来源:亿速云 阅读:77 作者:小猪 这篇文章主要讲解了Python多线程中主线程等待所有子线程结 ...

  6. 使用java理解程序逻辑 第十二章_Java多线程中锁的理解与使用(二)

    博主将会针对Java面试题写一组文章,包括J2ee,SQL,主流Web框架,中间件等面试过程中面试官经常问的问题,欢迎大家关注.一起学习,一起成长. 独享锁/共享锁 独享锁是指该锁一次只能被一个线程所 ...

  7. python阻塞子线程_Python多线程中阻塞与锁使用误区

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. java闭合数据_java多线程中线程封闭详解

    线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的 ...

  9. 对linux中多线程编程中pthread_join的理解

    对linux中多线程编程中pthread_join的理解 分类: 程序员面试 linux学习2013-08-04 21:32 234人阅读 评论(0) 收藏 举报 多线程linuxpthread_jo ...

最新文章

  1. 你的机器学习模型为什么会出错?奉上四大原因解析及五条改进措施
  2. 01背包问题,动态规划求解
  3. 【机器学习-西瓜书】六、支持向量机:核技巧;软间隔;惩罚因子C;松弛变量
  4. Web前端面试指导(十四):如何居中一个元素(正常、绝对定位、浮动元素)?
  5. 迷宫问题的通用解法C语言数据结构实现
  6. (3)Matplotlib_subplot, subplots
  7. 栈和队列的基础算法学习(EPI)
  8. js表单验证 - 数字
  9. 服务器vga转hdmi显示器不亮,HDMI转VGA后显示器不亮怎么办?
  10. 股价屡创新高,发布会带来“十三香”,苹果还能躺赢?
  11. Windows Embedded Standard 7 快速入门指南 2 of 4
  12. python怎么输入括号
  13. Winedt/CTeX/LaTeX编辑器显示行号
  14. 实验三 面向对象(二)(预习报告)
  15. 每日加瓦,终成栋房4-final、内部类、权限修饰符
  16. Unity C# 批量处理 命名空间 修改
  17. VBA 单一单元格的多行内容拆分为多行
  18. ON [PRIMARY]是表示....
  19. 备考软考高级系统架构设计师需要看哪些书?
  20. BlackShadow 黑客入侵以色列托管公司并勒索客户

热门文章

  1. 6.1-6.30推荐文章汇总
  2. 基于微信小程序的在线考试系统开题报告
  3. 亚马逊云科技 Build On 参与心得
  4. HTML5期末大作业:关于我的家乡——四川文化(4页) HTML+CSS+JavaScript
  5. 贾伟专访:我的内心住着一个女孩
  6. XFTP软件连接虚拟机
  7. LTV预估与留存曲线拟合:指数函数还是幂函数?
  8. Jmeter学习-BeanShell 内置变量vars、props、prev
  9. 你的孤独,虽败犹荣 很喜欢的句子
  10. QML控件类型:StackView