(1)信号量:进化版的互斥量

多个线程间对某个对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作数据共享的目的,却导致线程并发性下降。

信号量:相对折中的一个处理方式,既能保证同步,数据不混乱,又能提高线程开发。

(2)信号量相关函数

sem_t类型,用来定义信号量。虽然是结构体,使用的时候可以当做整数看待(类似文件描述符)。

规定信号量不能小于0,信号量的初值,决定了占用信号量的线程的个数。

头文件在<semaphore.h>

1)初始化一个信号量:sem_init

int  sem_init(sem_t *sem,int pshared,unsigned int value);

参数1:信号量

参数2:取0表示线程间共享,取1表示进程间

参数3;信号量初值

2)销毁一个信号量:sem_destroy

int sem_destroy(sem_t *sem);

3)给信号量加锁:sem_wait(信号量初值--)

int sem_wait(sem_t *sem);

4)给信号量解锁:sem_post(信号量初值++)

int sem_post(sem_t *sem);

5)尝试对信号量加锁:sem_trywait

int sem_trywait(sem_t *sem);

6)限时尝试给信号量加锁:sem_timedwait

int sem_timedwait(sem_t *sem,const struct timespec*abs_timeout);

(3)进程间同步

进程间也可以通过互斥锁来达到同步,但必须在pthread_mutex_init初始胡之前,修改其属性为进程间共享。

pthread_mutexattr_t mattr类型,用来定义mutex锁的属性,修改mutex锁属性函数。

1)初始化一个mutex属性对象:pthread_mutexattr_init

int pthread_mutexattr_init(pthread_mutexattr_t *attr);

2)销毁一个mutex属性对象:pthread_mutexattr_destroy

int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);

3)修改mutex属性

int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr , int pshared);

参数2:取值:

线程锁:PTHREAD_PROCESS_PRIVATE(mutex默认属性,进程间私有);

进程锁:PTHREAD_PROCESS_SHARED

(4)使用进程锁完成同步

(5)文件锁

借助fcntl来实现锁机制。操作文件的进程没有获得锁时 ,可以打开,但无法执行read/write操作

fcntl函数:获取和修改文件访问控制属性

int fcntl(int fd,int cmd,.../*arg*/);

参数2:F_SETLK:设置文件锁(trylock)

F_SETLKW 设置文件锁(wait)

F_GETLK 获取文件锁

参数3:

struct flock{

.....

short l_type;//锁的类型:F_RDLCK,F_WRLCK,F_UNLCK(解锁);

short l_whence;//偏移位置,SEEK_SET,SEEK_CUR,SEEK_END

off_t l_start;//起始偏移量

off_t l_len;  //加锁数据的长度,len=0,对整个文件加锁

pid_t l_pid;//持有该锁的进程ID:(F_GETLK only)

...

};

(6)进程间文件锁

(7)多线程中,能否使用文件锁?

多线程之间共享文件描述符,而给文件加锁,是通过修改文件描述符所指向的文件结构体中的成员变量来实现的。因此线程之间无法使用文件锁。

linux操作系统之信号量、互斥量在进程间的同步、文件锁相关推荐

  1. 信号量 互斥量 条件变量

    原文:https://blog.csdn.net/qq_32646795/article/details/78221005 本文打算写一些和锁有关的东西,谈一谈我对锁的原理和实现的理解,主要包含以下方 ...

  2. java 进程同步代码_java 实现进程间的同步(源代码)

    操作系统课程设计:实现进程间的同步. 有问题留言 import java.util.concurrent.Semaphore; /******** 信号量 *******/ class Sign { ...

  3. linux mutex 数量上限,互斥量mutex

    Linux中提供一把互斥锁mutex(也称之为互斥量). 每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁. 资源还是共享的,线程间也还是竞争的,但通过"锁"就将 ...

  4. Linux操作系统原理与应用03:进程

    目录 1. 进程简介 1.1 程序和进程 1.2 进程的定义 1.2.1 正文段 1.2.2 用户数据段 1.2.3 系统数据段 1.3 进程的层次结构 1.3.1 进程的亲缘关系 1.3.2 进程树 ...

  5. Linux——线程使用及互斥量

    线程的基本操作 概念 线程是程序中的一个执行路线.每个程序当中至少有一个线程. 程序在执行的过程中是逐条执行的,按照代码的逻辑一次向下执行,所以无法同时完成两条指令,故而引进了线程,举个很简单的例子, ...

  6. [入门篇]Linux操作系统fork子进程的创建以及进程的状态 超超超详解!!!我不允许有人错过!!!

    目录 0.前言 1.fork()创建子进程讲解 1.1fork()的简单介绍 1.2 创建子进程详解 1.2.1 如何理解fork创建子进程 1.2.2 子进程的PCB以及子进程的代码和数据 1.2. ...

  7. C语言 互斥量(加锁)解决同步问题

    友链 gcc 1.c -o 1 -lpthread // ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存映射 ...

  8. 共享内存大数据量快速进程间通讯

    最近在做一个进程间频繁,数据量比较大的通讯 采用的是共享内存通讯,和生产者消费者模式.调试了几天,记录一些要点 结构如下图 注意: 1.因为是共享,如果进程B有多个对象要写数据到共享内存,每次写入计数 ...

  9. 使用CreateFileMapping来进行进程间的通信和使用信号量来进行同步操作——进程间实现图片传输

    使用共享内存+信号量来进行进程间的通信,实现进程间的图片传输 推荐使用opencv3.x版本,因为opencv4.x就不支持IplImage和Mat类型之间的转换, 有两个进程:图片采集端和图片计算端 ...

最新文章

  1. lightoj-1028 Trailing Zeroes (I)
  2. c语言的运算符表格,C语言教案(运算符和表格达式).ppt
  3. php批量新增数据类型,Yii框架批量插入数据扩展类的简单实现方法
  4. (转)ATOM介绍和使用
  5. 【摘】蓝牙技术及其协议栈
  6. idea java 桌面应用_IDEA打包应用程序的教程图解
  7. Unity3D场景漫游以及碰撞防止反弹
  8. Android下磁盘分区表损坏,电脑硬盘分区表损坏怎么修复?电脑硬盘分区表损坏的修复方法...
  9. 性能测试基本功 - Centos5.5下安装LAMP
  10. ik6yjtkyt不规范价格
  11. 2021海口高考调研成绩查询,2021海口市地区高考成绩排名查询,海口市高考各高中成绩喜报榜单...
  12. 企业上云计算最大的障碍是什么?
  13. Qt TextEdit 不自动换行 取消换行
  14. Enhance Security with Port Knocking
  15. 专家揭示连锁加盟陷阱
  16. tf.keras入门系列(一)
  17. 用Filmage Editor制作视频,赢不限时长录屏神器永久序列码!
  18. [转]SMART原则
  19. 关于Unity碰撞检测失败的冷门原因
  20. 编译安装Gearman

热门文章

  1. 闲话杂谈—至曾经的自己
  2. 查看环境变量有无配置成功等命令操作
  3. 文献综述写作之“结构内容”
  4. 那些年困扰我们的Linux 的蠕虫、病毒和木马
  5. Delphi 一些函数解释
  6. Floyd算法应用-医院选址问题
  7. WP7之Application Bar控件
  8. 《那些年啊,那些事——一个程序员的奋斗史》——78
  9. 根据数据库中的值用js设置RadioButtonList选中与否
  10. c++ ptree判断是否存在节点_CTreeCtrl 查找 等于某值 的节点,并设置为高亮