进程间同步(互斥量、信号量)

2023-10-30

进程间同步可以使用互斥量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);                //销毁mutex
    munmap(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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程间同步(互斥量、信号量) 的相关文章

  • Linux·网络编程套接字(一)

    目录 预备知识 理解源IP地址和目的IP地址 理解源MAC地址和目的MAC地址 理解源端口号和目的端口号 PORT VS PID 认识TCP协议和UDP协议 网络字节序 socket编程接口 socket常见API sockaddr结构 简
  • 13LinuxC线程学习之利用pthread_create设置线程分离属性和相关属性解释

    1 线程属性 1 本节作为指引性介绍 linux下线程的属性是可以根据实际项目需要 进行设置 之前我们讨论的线程都是采用线程的默认属性 默认属性已经可以解决绝大多数开发时遇到的问题 如我们对程序的性能提出更高的要求那么需要设置线程属性 比如
  • Linux下特有的reboot()函数的简介

    1 Linux下c程序通过调用reboot 函数 可以实现系统的重启 挂机 Power Down等功能 2 1 对于libc5或libc4来说 库函数的原型声明中包含四个参数 具体函数原型声明如下 include
  • Linux线程介绍(Linux 系统编程)

    进程与线程 典型的UNIX Linux进程可以看成只有一个控制线程 一个进程在同一时刻只做一件事情 有了多个控制线程后 在程序设计时可以把进程设计成在同一时刻做不止一件事 每个线程各自处理独立的任务 进程是程序执行时的一个实例 是担当分配系
  • 编写第一个Makefile(HelloWorld)

    什么是Makefile 讲makefie之前 先将将什么是make make是一个命令工具 是一个解释makefile中指令的命令工具 它可以简化编译过程里面所下达的指令 当执行 make 时 make 会在当前的目录下搜寻 Makefil
  • Posix信号量

    Posix信号量 一 Posix信号量 1 概述 二 Posix提供两种信号量 有名信号量和基于内存的信号量 三 命名信号量 1 sem open和sem close函数 2 sem unlink函数 3 sem wait函数 5 sem
  • 04LinuxC线程学习之pthread_create创建线程

    1 pthread self函数 pthread t pthread self void 功能 获取线程ID 其作用对应进程中 getpid 函数 返回值 成功 0 失败 无 两个进程间 线程ID允许相同 2 pthread create函
  • 进程的相概念(linux系统编程)

    什么是程序 什么是进程 有什么区别 程序是静态的概念 gcc xx x o pro 磁盘中生成的pro就是程序 进程是程序的一次运行活动 通俗的讲就是程序跑起来了 系统中就多了一个进程 在Linux里面怎么查看系统中有哪些进程 使用ps指令
  • 【Linux】进程控制,进程替换

    1 进程创建 fork函数初识 在linux中fork函数时非常重要的函数 它从已存在进程中创建一个新进程 新进程为子进程 而原进程为父进程 include
  • 14LinuxC线程学习之查看当前pthread库版本和线程使用的注意事项(重要)

    1 查看当前pthread库版本 1 查看当前pthread库版本 getconf GNU LIBPTHREAD VERSION 2 NPTL名词了解 NPTL实现机制 POSIX Native POSIX Thread Library 3
  • 面试官都在问

    面试官都在问 Linux命令mpstat详解 1 mpstat的基本用法 mpstat的全称为Multiprocessor Statistics 是一款常用的多核CPU性能分析工具 用来实时查询每个CPU的性能指标 以及所有CPU的平均指标
  • 十、C++11左值右值、左值引用、右值引用、万能引用、完美转发

    10 C 11左值右值 左值引用 右值引用 10 1 左值 右值 左值 可以在 左边使用的值 右值 只能在 右边使用的值 字面量 中间结果 临时对象 匿名对象 无法直接取地址 不能使用左值引用 10 2 左值引用 右值引用 实例 左值引用
  • Linux系统编程(七)--线程控制

    文章目录 1 线程属性 1 1 pthread attr t 1 2 不同属性的作用 2 互斥量的共享属性 2 1 属性的初始化与回收 2 2 共享属性 3 互斥量的鲁棒属性 3 1 相关函数 3 2 互斥量状态一致性 4 递归型互斥量 4
  • fgetc、fgets用法 && 实现cp操作

    fgetc函数原型 int fgetc FILE stream 为什么fgetc返回的是int而不是char 通过man fgetc查看其返回值 fgetc getc and getchar return the character rea
  • 《UNIX环境高级编程》笔记 第十三章-守护进程

    1 概念 守护进程 daemon 是生存期长的一种进程 它们常常在系统引导装入时启动 仅在系统关闭时才终止 因为它们没有控制终端 所以说它们是在后台运行的 Linux的大多数服务就是用守护进程实现的 这些守护进程名通常以d结尾 如inetd
  • pthread_detach函数

    int pthread detach pthread t thread 成功 0 失败 错误号 作用 从状态上实现线程分离 注意不是指该线程独自占用地址空间 线程分离状态 指定该状态 线程主动与主控线程断开关系 线程结束后 不会产生僵尸线程
  • Linux·DNS协议、ICMP协议、NAT技术

    目录 DNS协议 DNS背景 编辑域名简介 域名解析过程 使用dig工具分析DNS过程 ICMP协议 ICMP功能 ICMP协议格式 编辑ping命令 一个值得注意的坑 traceroute命令 NAT技术 NAT技术背景 NAT IP转换
  • 进程和线程的详解和区别

    1 进程和线程概述 我们都知道计算机的核心是CPU 它承担了所有的计算任务 而操作系统是计算机的管理者 它负责任务的调度 资源的分配和管理 统领整个计算机硬件 应用程序是具有某种功能的程序 程序是运行于操作系统之上的 2 进程 我们编写的代
  • 【hello Linux】进程间通信——共享内存

    目录 前言 1 System V共享内存 1 共享内存的理解 2 共享内存的使用步骤 3 共享内存的使用 1 共享内存的创建 查看共享内存 2 共享内存的释放 3 共享内存的挂接 4 共享内存的去挂接 4 共享内存的使用示例 1 两进程挂接
  • 02Linux下C语言锁的学习之Linux下的读写锁

    02Linux下C语言锁的学习之Linux下的读写锁 概述 下面的锁的意思均是代表读写锁 读写锁的特性 1 若一把锁被一个线程以读方式锁住 当其它线程以读方式上锁的话 那么可以上锁成功 2 若一把锁被一个线程以写方式锁住 当其它线程以读或者

随机推荐

  • 【NLP】T5:文本到文本转换器

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 智能指针类HasPtr

    智能指针是存储指向动态分配对象指针的类 用于控制对象的生存期 能够确保自动正确的销毁动态分配的对象 防止内存泄露 HasPtr 在其他方面的行为与普通指针一样 具体而言 复制对象时 副本和原对象将指向同一基础对象 如果通过一个副本改变基础对
  • 微信小程序车牌号码输入(虚拟键盘)

    近日在网上看到一位博主写的微信小程序 输入车牌号 有新能源 原文链接 https blog csdn net qq706352062 article details 105554453 ops request misc 257B 2522r
  • ppt复现CVPR顶会流程图

    本次目标如下图 难点在于立方体和矩阵格网的绘制 文末附机器学习绘图模板 先来绘制立方体 插入 形状 立方体 调节成如下图 再点击水平翻转 绘制矩形 多绘制几个组合成矩形格网 右键设置形状和格式 输入以下参数 调整好使其贴合立方体 如图所示
  • 全志V3S环境编译开发流程

    这里使用的是荔枝派Zero 官网上面没有带spiflash的 首先准备一张SD卡 U BOOT 首先需要配置交叉编译环境 这里就不多说了 需要的话前往Sipeed官网 Sipeed 首先获取uboot源码 git clone https g
  • vscode快捷键:定位某一行,跳转到这一行

    快捷键 Ctrl G 然后在弹出的框中输入行数就可以了 参考 https blog csdn net cvper article details 81090028
  • Spring的三种注入方式:构造方法注入,set方法注入,注解注入

    本文演示三种值注入方式和三层模式下的注解注入获取对象 首先是搭建基本的Spring运行环境导入四个基本的核心jar包和两个日志包 在src根目录下新建bean xml的配置文件 同时引入dtd约束 一 构造函数注入 在bean xml中配置

  • 分割线样式

    hr style height 2px border none border top 2px ridge green
  • vue项目 后端传给base64格式图形验证码 ,前端进行解析,回显。

    我们在实际项目中时在登录的时候 时常会遇到图形验证码 来进行验证用户操作 什么是图形验证码 图形验证码是验证码的一种 有防止黑客对某一特定注册用户用程序暴力破解私人信息 恶意破解密码 刷论坛灌水的作用 票 图形验证码是一种区分用户是计算机还
  • SpringBoot底层原理

    SpringBoot底层原理 一 SpringBoot是什么 二 SpringBoot核心原理 三 springboot启动原理 一 SpringBoot是什么 想要了解springboot底层原理必须要先知道springboot是什么 作
  • 计算机视觉领域关注的会议和期刊

    原本为给师弟师妹总结的自己经验 节省计算机视觉领域大家看什么论文和去哪里看论文的困惑 一 会议论文 视觉的领域主要关注的三大顶会论文 CVPR ICCV ECCV 搜索途径 1 CVPR和ICCV都是IEEE库 可以在IEEE explor
  • QT中ui文件生成关联的C++类

    在VS2008中给对话框资源添加关联的C 类时 可通过右键菜单 添加类 直接添加关联的C 类 但QT中不支持这样的操作 在QT中在创建界面ui时 可手动也可自动创建ui文件关联的C 类 分别如下所示 一 自动创建ui文件和对应的C 类 项目
  • C语言开发网站

    在正式开发之前 先了解一下网站的原理 请求 处理 响应 在浏览器的network中可以看到浏览器和服务器的交互过程 请求一个网站的本质就是咱们的浏览器和服务器交互的一个过程 比如说咱们请求www baidu com 就是咱们的浏览器向服务器
  • lede 插件_路由器帮你签到!「LEDE/Openwrt系统“签到狗”插件使用教程」

    每日签到 废话不多说 用了才知道 图标 支持的站点 baidu 百度贴吧 百度文库v2ex V2EXhostloc hostloc comacfun A站bilibili B站163music 网易云音乐PCmiui 小米论坛52pojie
  • getline函数

    在我的印象中 getline函数经常出现在自己的视野里 模糊地记得它经常用来读取字符串 但是又对它的参数不是很了解 今天又用到了getline函数 现在来细细地总结一下 首先要明白设计getline函数的目的 其实很简单 就是从流中读取字符
  • 超强大JS表格:DataViewsJS 1.8.16.1407 Crack

    DataViewsJS完整的 JavaScript 数据呈现和数据网格平台 通过从各种不同的演示视图中进行选择 包括树 卡片 砖石 网格 时间线 甘特图 日历和网格 超越传统的表格显示 快速地 纯 JavaScript 针对速度进行了优化
  • ECMAScript 6规范总结(长文慎入)

    闲话 学习ES6的动机起于对其promise标准的好奇 它与jQuery源码中Deferred不同 而且在异步编程中加入了Generator 在后续ES7中更有Async 这勾起我强烈的兴趣了解ES6更多的内容 于是完整的学习了阮一峰老师的
  • Java Web实战开发基础:MVC模式

    Java Web的MVC模式 MVC是java web的基础 我写的java web实战开发专栏系列都是基于MVC 建议有需要的订阅我专栏的铁铁先提前看看这篇博文哦 简介 Java Web开发中 采用MVC Model View Contr
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 进程间同步(互斥量、信号量)

    进程间同步可以使用互斥量mutex 互斥锁 信号量和文件锁 进程间同步使用信号量 int sem init sem t sem int pshared unsigned int value 用于进程间同步此时第二个参数不能取0了 取非0值用