进程间同步可以使用互斥量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

进程间同步(互斥量、信号量)相关推荐

  1. c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  2. 秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

    前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了 ...

  3. 秒杀多线程第七篇 经典线程同步 互斥量Mutex

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  4. linux 进程间读写锁,Linux系统编程—进程间同步

    我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. ##互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上 ...

  5. 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题

    秒杀多线程第十五篇 关键段,事件,互斥量,信号量的"遗弃"问题 在<秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量>中对经典多线程同步互斥问题进行了回 ...

  6. 进程间同步的几种方法

    什么是临界区? 每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源).每次只准许一个进程进入临界区,进入后不允许其他进程进入. 进程间同步 把异步环境下的一组并发进 ...

  7. 如何保证进程间同步工作_系统设计硬核知识(2)——操作系统的进程管理

    操作系统基本原理包含以下 5 大管理. 我们先来说说进程管理. 因为处理机是计算机系统的核心资源,所以整个操作系统的重心是处理机管理. 处理机管理中最基本的.最重要的概念是进程.进程是系统并发执行的体 ...

  8. android p获取通话记录_Android 底层的进程间同步机制

    作者:Android面试官 进程间通信的经典实现 进程间通信(Inter-process communication,IPC)指运行在不同进程中的若干线程间的数据交换,可发生在一台机器上,也可通过网络 ...

  9. 利用管道实现进程间同步

    进程间同步是指进程的运行有先后顺序,如A进程等待B进程执行完某个动作A进程才能继续往下运行.进程间通信的方法都可以用来同步,只是操作是否方便的一个问题.复习了UNIX高级编程,觉得POSIX的信号量是 ...

最新文章

  1. android studio没有org.apache.http.client.HttpClient;等包问题 解决方案
  2. 二次元妹子五官画风都能改,周博磊团队用无监督方法控制GAN | CVPR 2021
  3. python批量读取根目录下文件内容并保存
  4. python学习_22(文件)
  5. ECMAScript 6 未来前景
  6. SPOJ - SUBLEX Lexicographical Substring Search(后缀自动机)
  7. 规模数据导入高效方式︱将数据快速读入R—readr和readxl包
  8. 「leetcode」C++题解:239. 滑动窗口最大值,单调队列的经典题目
  9. 知识分享|日本面试常考问题+巧妙回答①
  10. AD9361_AD9371_AD9363_AD9364 对比
  11. vue-pdf 字体不显示
  12. SCDPM2019服务器恢复数据
  13. colorbox弹出层插件使用方法及注意事项
  14. 想要快速、免费的翻译外文PDF文档?Get翻译神器
  15. 补点C#基础_022_json校验和json在线编辑器-bejson
  16. SitePoint播客#71:不断发展的互联网
  17. 如何通过Java实现485通信
  18. PPT训练营-封面页
  19. Nelder-Mead(simplex,“单纯形”)算法
  20. 使用blender将全景图转为天空盒图

热门文章

  1. (转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
  2. 介绍针对企业级Flex开发的开源项目FlexibleShare
  3. linux raw socket 例子,raw socket编程例子
  4. ubuntu更新python的指令_ubuntu下python模块的库更新(转载)
  5. centos 多个mysql,Centos中安装多个MySQL数据的配置实例
  6. 记录程序写入日志_终于有人把MySQL 三大日志讲清楚了
  7. mysql与jframe_java-如何在JFrame上显示从mysql检索到的图像
  8. oracle10g的rat模拟,Oracle 10g Logminer 研究及测试
  9. 计算几何问题 java_【转载】ACM计算几何题目推荐
  10. 栈-线性表(代码、分析、汇编)