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

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中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

Ollama整合open-webui的步骤及访问

《Ollama整合open-webui的步骤及访问》:本文主要介绍如何通过源码方式安装OpenWebUI,并详细说明了安装步骤、环境要求以及第一次使用时的账号注册和模型选择过程,需要的朋友可以参考... 目录安装环境要求步骤访问选择PjrIUE模型开始对话总结 安装官方安装地址:https://docs.

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例: