进程间 对共享资源的访问 互斥 机制

2024-06-02 11:38

本文主要是介绍进程间 对共享资源的访问 互斥 机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/lanseshenhua/article/details/5557017

Linux下的多进程间共享资源的互斥访问

分类: Linux编程   4291人阅读  评论(1)  收藏  举报
linux null 测试

把源代码运行一遍就知道了

[cpp]  view plain copy
  1. #include    <stdio.h>  
  2. #include    <stdlib.h>  
  3. #include    <unistd.h>  
  4. #include    <fcntl.h>  
  5. #include    <sys/mman.h>  
  6. #include    <pthread.h>  
  7. pthread_mutex_t* g_mutex;  
  8. //创建共享的mutex  
  9. void init_mutex(void)  
  10. {  
  11.     int ret;  
  12.     //g_mutex一定要是进程间可以共享的,否则无法达到进程间互斥  
  13.     g_mutex=(pthread_mutex_t*)mmap(NULL, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);  
  14.     if( MAP_FAILED==g_mutex )  
  15.     {  
  16.         perror("mmap");  
  17.         exit(1);  
  18.     }  
  19.       
  20.     //设置attr的属性  
  21.     pthread_mutexattr_t attr;  
  22.     pthread_mutexattr_init(&attr);  
  23.     //一定要设置为PTHREAD_PROCESS_SHARED  
  24.     //具体可以参考http://blog.chinaunix.net/u/22935/showart_340408.html  
  25.     ret=pthread_mutexattr_setpshared(&attr,PTHREAD_PROCESS_SHARED);  
  26.     if( ret!=0 )  
  27.     {  
  28.         perror("init_mutex pthread_mutexattr_setpshared");  
  29.         exit(1);  
  30.     }  
  31.     pthread_mutex_init(g_mutex, &attr);  
  32. }  
  33. int main(int argc, char *argv[])  
  34. {  
  35.     init_mutex();  
  36.     int ret;      
  37.     char str1[]="this is child process/r/n";  
  38.     char str2[]="this is father process/r/n";  
  39.     int fd=open("tmp", O_RDWR|O_CREAT|O_TRUNC, 0666);  
  40.     if( -1==fd )  
  41.     {  
  42.         perror("open");  
  43.         exit(1);  
  44.     }  
  45.     pid_t pid;  
  46.     pid=fork();  
  47.     if( pid<0 )  
  48.     {  
  49.         perror("fork");  
  50.         exit(1);  
  51.     }  
  52.     else if( 0==pid )  
  53.     {  
  54.         ret=pthread_mutex_lock(g_mutex);  
  55.         if( ret!=0 )  
  56.         {  
  57.             perror("child pthread_mutex_lock");  
  58.         }  
  59.         sleep(10);//测试是否能够阻止父进程的写入  
  60.         write(fd, str1, sizeof(str1));  
  61.         ret=pthread_mutex_unlock(g_mutex);    
  62.         if( ret!=0 )  
  63.         {  
  64.             perror("child pthread_mutex_unlock");  
  65.         }     
  66.     }  
  67.     else  
  68.     {  
  69.         sleep(2);//保证子进程先执行   
  70.         ret=pthread_mutex_lock(g_mutex);  
  71.         if( ret!=0 )  
  72.         {  
  73.             perror("father pthread_mutex_lock");  
  74.         }  
  75.         write(fd, str2, sizeof(str2));  
  76.         ret=pthread_mutex_unlock(g_mutex);    
  77.         if( ret!=0 )  
  78.         {  
  79.             perror("father pthread_mutex_unlock");  
  80.         }                 
  81.     }  
  82.     wait(NULL);  
  83.     munmap(g_mutex, sizeof(pthread_mutex_t));  
  84. }  

运行后tmp文件内容为:

this is child process

this is father process

这篇关于进程间 对共享资源的访问 互斥 机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023862

相关文章

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务