目录

一 互斥锁的含义

二 互斥锁的使用

2.1 互斥锁的创建

2.2 互斥锁的销毁

2.3 互斥锁的加锁(阻塞)

2.4 互斥锁的加锁(非阻塞)

2.5 互斥锁的解锁

三 互斥锁的使用


一 互斥锁的含义

互斥锁其实就相当于一个初值为1的二元信号量,互斥锁只有两种状态,要么解锁,要么上锁。互斥锁一般用于保护关键代码,从而实现互斥访问。

二 互斥锁的使用

互斥锁相关函数在pthread.h头文件中声明。

2.1 互斥锁的创建

int pthread_mutex_init(pthread_mutex_t*mutex,const pthread_mutexattr_t*mutexattr);

函数功能:用于初始化一个互斥锁。

函数参数:mutexattr指针用于设置互斥锁的属性,不过一般取NULL时,互斥锁会初始化为默认属性。

2.2 互斥锁的销毁

int pthread_mutex_destroy(pthread_mutex_t*mutex);

函数功能:一般用于销毁一个互斥锁,如果销毁一个已经加锁的互斥锁,将会导致不可预期的后果。

2.3 互斥锁的加锁(阻塞)

int pthread_mutex_lock(pthread_mutex_t*mutex);

函数功能:一般用于给一个互斥锁加锁,当对一个已经被其他线程加锁的互斥锁继续加锁,会导致阻塞,直到该互斥锁的占有者将该互斥锁解锁。

2.4 互斥锁的加锁(非阻塞)

int pthread_mutex_trylock(pthread_mutex_t*mutex);

函数功能:一般用于给一个互斥锁加锁,当对一个已经被其他线程加锁的互斥锁加锁,将会直接返回-1,设置错误码erron为EBUSY。

2.5 互斥锁的解锁

int pthread_mutex_unlock(pthread_mutex_t*mutex);

函数功能:一般用于给一个互斥锁解锁。如果此时有其他线程等待该互斥锁,其他线程将获得互斥锁。

三 互斥锁的使用

测试代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>pthread_mutex_t mutex;void* thread()
{pthread_mutex_lock(&mutex);int i = 0;while(i++ < 4){printf("b\n");sleep(1);}pthread_mutex_unlock(&mutex);
}int main()
{int ret = pthread_mutex_init(&mutex, NULL);if(ret != 0){printf("创建互斥锁失败");return -1;}pthread_t tid;ret = pthread_create(&tid, NULL, thread, NULL);if(ret != 0){printf("创建线程失败");return -1;}pthread_mutex_lock(&mutex);int i = 0;while(i++ < 4){printf("a\n");sleep(1);}pthread_mutex_unlock(&mutex);pthread_join(tid, NULL);return 0;
}

运行结果:

1.加互斥锁:

2.未加互斥锁:

互斥锁的含义及其使用相关推荐

  1. golang:1.并发编程之互斥锁、读写锁详解

    本文转载自junjie,而后稍作修改. 一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是 ...

  2. 【C++】多线程与互斥锁【二】

    文章目录 1. 并发是什么 1.1 并发与并行 1.2 硬件并发与任务切换 1.3 多线程并发与多进程并发 2. 为什么使用并发 2.1 为什么使用并发 2.2 并发和多线程 3. 并发需要注意的问题 ...

  3. Linux下多线程编程互斥锁和条件变量的简单使用

    Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...

  4. golang mutex互斥锁分析

    互斥锁:没有读锁写锁之分,同一时刻,只能有一个gorutine获取一把锁 数据结构设计: type Mutex struct {state int32 // 将一个32位整数拆分为 当前阻塞的goro ...

  5. 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)

    上篇文章也蛮好,线程同步之条件变量与互斥锁的结合: http://www.cnblogs.com/charlesblc/p/6143397.html  现在有这篇文章: http://blog.csd ...

  6. 非常精简的Linux线程池实现(一)——使用互斥锁和条件变量

    https://blog.csdn.net/kxcfzyk/article/details/31719687 线程池的含义跟它的名字一样,就是一个由许多线程组成的池子. 有了线程池,在程序中使用多线程 ...

  7. python中的非阻塞使用互斥锁

    锁定方法acquire可以有一个blocking参数. 如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True) 如果设定blocking为Fal ...

  8. Multi_thread--Linux下多线程编程互斥锁和条件变量的简单使用

    Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...

  9. java 信号量 互斥锁_线程同步(互斥锁与信号量的作用与区别)

    "信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里).而互斥锁是用在多线程多任务互斥的,一 ...

最新文章

  1. Sql注入和Html注入
  2. 抢红包要当心!钱盾反诈平台专家揭秘3类假红包骗局
  3. 部分 VII. Array
  4. object references an unsaved transient instance【异常】
  5. Ubuntu18.04安装rabbitmq
  6. 程序员修神之路--分布式系统设计理念这么难学?
  7. 取数函数设置向导返回值说明
  8. HDFS block丢失过多进入安全模式(safe mode)的解决方法
  9. 线索化二叉树的创建与遍历
  10. 看翁恺〈java语言〉视频有感
  11. caffe入门学习(5):绘制网络结构图
  12. ai钢笔工具怎么描线_ps钢笔工具怎么用——绘制直线、平滑曲线、转折曲线
  13. python求幂_python 求幂
  14. 一个公布每天全球被黑网站的站点
  15. 论坛php 图片上传,Discuz! X3 论坛文件图片上传尺寸:小于2M的修改方法
  16. 大数据特点和基本处理流程
  17. 给你讲个滑稽的故事:
  18. python剔除st股_如何判断某只股票过去是不是ST股
  19. 求坐标系中三角形的面积
  20. Linux获得webinf路径,Linux系统快速定位web路径方法

热门文章

  1. 上海教师编制计算机等级,上海教师编制那么难,为什么还有那么多人考?
  2. 2020最新版Selenium异常集锦
  3. SQL索引使用以及性能总结
  4. 每天记录学习的新知识 : Disposable和CompositeDisposable
  5. php instr(),vb中instr函数怎么用
  6. postgresql 时间时间相加比较
  7. linux modprobe自动加载,Linux运维知识之Linux modprobe自动处理可载入模块命令详解
  8. 51单片机P0端口的驱动能力、上拉电阻、限流电阻、下拉电阻
  9. Nexus 6 编译并刷机 Android 7.1.1 AOSP以及常用的修改源码快速验证方法
  10. 【全开源】TP+VUE家政上门服务派单接单技师商家入驻全开源uniapp小程序H5网页公众号