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

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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

【Tools】大模型中的注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 在大模型中,注意力机制是一种重要的技术,它被广泛应用于自然语言处理领域,特别是在机器翻译和语言模型中。 注意力机制的基本思想是通过计算输入序列中各个位置的权重,以确

java 进程 返回值

实现 Callable 接口 与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。 public class MyCallable implements Callable<Integer> {public Integer call() {return 123;}} public static void main(String[] args