进程间同步(互斥量、信号量)
进程间同步可以使用互斥量mutex(互斥锁)、信号量和文件锁。
进程间同步使用信号量:
int sem_init(sem_t *sem, int pshared, unsigned int value);
用于进程间同步此时第二个参数不能取0了,取非0值用于进程间同步,一般取1,也可按照下述方法取值,即:PTHREAD_PROCESS_SHARED。
(1)进程间使用互斥量进行同步
在pthread_mutex_init初始化之前,修改其属性为进程间共享。mutex的属性修改函数主要有以下几个:
pthread_mutexattr_t mattr 类型:用于定义mutex锁的属性;
int pthread_mutexattr_init(pthread_mutexattr_t *attr); 初始化一个mutex属性对象;
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared); 修改mutex属性;参2:pshared取值:进程锁:PTHREAD_PROCESS_SHARED; 线程锁:PTHREAD_PROCESS_PRIVATE (mutex的默认属性即为线程锁,进程间私有)
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); 销毁mutex属性对象 (而非销毁锁)
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 即将修改后的属性传入该函数,即可产生一个进程锁。
//进程间使用互斥量来实现同步
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/mman.h>
#include <sys/wait.h>struct mt {int num;pthread_mutex_t mutex;pthread_mutexattr_t mutexattr;
};int main(void)
{int i;struct mt *mm;pid_t pid;
/* 文件映射方式创建映射区int fd = open("mt_test", O_CREAT | O_RDWR, 0777);ftruncate(fd, sizeof(*mm));mm = mmap(NULL, sizeof(*mm), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);close(fd);unlink("mt_test");
*/ mm = mmap(NULL, sizeof(*mm), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);memset(mm, 0, sizeof(*mm)); //初始化内存pthread_mutexattr_init(&mm->mutexattr); //初始化mutex属性对象pthread_mutexattr_setpshared(&mm->mutexattr, PTHREAD_PROCESS_SHARED); //修改属性为进程间共享pthread_mutex_init(&mm->mutex, &mm->mutexattr); //初始化一把mutex琐pid = fork();if (pid == 0) {for (i = 0; i < 10; i++) {pthread_mutex_lock(&mm->mutex);(mm->num)++;printf("-child----------num++ %d\n", mm->num);pthread_mutex_unlock(&mm->mutex);sleep(1);}} else if (pid > 0) {for ( i = 0; i < 10; i++) {sleep(1);pthread_mutex_lock(&mm->mutex);mm->num += 2;printf("-------parent---num+=2 %d\n", mm->num);pthread_mutex_unlock(&mm->mutex);}wait(NULL);}pthread_mutexattr_destroy(&mm->mutexattr); //销毁mutex属性对象pthread_mutex_destroy(&mm->mutex); //销毁mutexmunmap(mm,sizeof(*mm)); //释放映射区return 0;
}
[root@localhost 02_pthread_sync_test]# ./process_mutex
-child----------num++ 1
-------parent---num+=2 3
-child----------num++ 4
-------parent---num+=2 6
-child----------num++ 7
-child----------num++ 8
-------parent---num+=2 10
-------parent---num+=2 12
-child----------num++ 13
-------parent---num+=2 15
-child----------num++ 16
-child----------num++ 17
-------parent---num+=2 19
-child----------num++ 20
-------parent---num+=2 22
-child----------num++ 23
-------parent---num+=2 25
-child----------num++ 26
-------parent---num+=2 28
-------parent---num+=2 30
进程间同步(互斥量、信号量)相关推荐
- c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
- 秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量
前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了 ...
- 秒杀多线程第七篇 经典线程同步 互斥量Mutex
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- linux 进程间读写锁,Linux系统编程—进程间同步
我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. ##互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上 ...
- 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题
秒杀多线程第十五篇 关键段,事件,互斥量,信号量的"遗弃"问题 在<秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量>中对经典多线程同步互斥问题进行了回 ...
- 进程间同步的几种方法
什么是临界区? 每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源).每次只准许一个进程进入临界区,进入后不允许其他进程进入. 进程间同步 把异步环境下的一组并发进 ...
- 如何保证进程间同步工作_系统设计硬核知识(2)——操作系统的进程管理
操作系统基本原理包含以下 5 大管理. 我们先来说说进程管理. 因为处理机是计算机系统的核心资源,所以整个操作系统的重心是处理机管理. 处理机管理中最基本的.最重要的概念是进程.进程是系统并发执行的体 ...
- android p获取通话记录_Android 底层的进程间同步机制
作者:Android面试官 进程间通信的经典实现 进程间通信(Inter-process communication,IPC)指运行在不同进程中的若干线程间的数据交换,可发生在一台机器上,也可通过网络 ...
- 利用管道实现进程间同步
进程间同步是指进程的运行有先后顺序,如A进程等待B进程执行完某个动作A进程才能继续往下运行.进程间通信的方法都可以用来同步,只是操作是否方便的一个问题.复习了UNIX高级编程,觉得POSIX的信号量是 ...
最新文章
- android studio没有org.apache.http.client.HttpClient;等包问题 解决方案
- 二次元妹子五官画风都能改,周博磊团队用无监督方法控制GAN | CVPR 2021
- python批量读取根目录下文件内容并保存
- python学习_22(文件)
- ECMAScript 6 未来前景
- SPOJ - SUBLEX Lexicographical Substring Search(后缀自动机)
- 规模数据导入高效方式︱将数据快速读入R—readr和readxl包
- 「leetcode」C++题解:239. 滑动窗口最大值,单调队列的经典题目
- 知识分享|日本面试常考问题+巧妙回答①
- AD9361_AD9371_AD9363_AD9364 对比
- vue-pdf 字体不显示
- SCDPM2019服务器恢复数据
- colorbox弹出层插件使用方法及注意事项
- 想要快速、免费的翻译外文PDF文档?Get翻译神器
- 补点C#基础_022_json校验和json在线编辑器-bejson
- SitePoint播客#71:不断发展的互联网
- 如何通过Java实现485通信
- PPT训练营-封面页
- Nelder-Mead(simplex,“单纯形”)算法
- 使用blender将全景图转为天空盒图
热门文章
- (转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
- 介绍针对企业级Flex开发的开源项目FlexibleShare
- linux raw socket 例子,raw socket编程例子
- ubuntu更新python的指令_ubuntu下python模块的库更新(转载)
- centos 多个mysql,Centos中安装多个MySQL数据的配置实例
- 记录程序写入日志_终于有人把MySQL 三大日志讲清楚了
- mysql与jframe_java-如何在JFrame上显示从mysql检索到的图像
- oracle10g的rat模拟,Oracle 10g Logminer 研究及测试
- 计算几何问题 java_【转载】ACM计算几何题目推荐
- 栈-线性表(代码、分析、汇编)