代码

#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <assert.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <sstream>/***  返回一片共享内存标识符,用于后续获取该共享内存,以及销毁该共享内存*  file_name*  md5*/
namespace hhh{namespace hhh{class mutex_function{public:mutex_function() = default;// 定义进程锁结构体
//            typedef struct mutex_struct{
//                pthread_mutex_t lock;
//                pthread_mutexattr_t lock_attr;
//                int memory_addr;
//            }mutex_struct_t;typedef struct mutex_struct{pthread_rwlock_t lock;pthread_rwlockattr_t lock_attr;int memory_addr;}mutex_struct_t;//create memory_addrint create_share_memory_id(const int INDEX_OF_KEY,size_t md5){const char* FILE_PATH = "/home/gsc/Projects";key_t id = ftok(FILE_PATH,md5);const int share_memory_id = shmget(id,md5,IPC_CREAT | 0666);if (share_memory_id == -1){std::cout << "share_memory_id error!\n" << std::endl;exit(EXIT_FAILURE);}else{return share_memory_id;}}// 初始化进程锁结构体
//            int init_mutex_struct(mutex_struct_t* mutex_ptr){
//                pthread_mutexattr_init(&(mutex_ptr->lock_attr));
//                pthread_mutexattr_setpshared(&(mutex_ptr->lock_attr),PTHREAD_PROCESS_SHARED);
//                pthread_mutex_init(&(mutex_ptr->lock),&(mutex_ptr->lock_attr));
//                return 0;
//            }int init_mutex_struct(mutex_struct_t* mutex_ptr){pthread_rwlockattr_init(&(mutex_ptr->lock_attr));pthread_rwlockattr_setpshared(&(mutex_ptr->lock_attr),PTHREAD_PROCESS_SHARED);pthread_rwlock_init(&(mutex_ptr->lock),&(mutex_ptr->lock_attr));return 0;}// 在共享内存上定义进程锁结构体并且返回其位置mutex_struct_t* mutex_struct_addr(const int INDEX){int memory_id = create_share_memory_id(INDEX,sizeof (mutex_struct_t));mutex_struct_t * share_ptr = (mutex_struct_t* )shmat(memory_id, 0, 0);if (share_ptr == (void *)-1){std::cout << "share_ptr error!\n" << std::endl;exit(EXIT_FAILURE);}share_ptr->memory_addr = memory_id;assert(init_mutex_struct(share_ptr)== 0);return share_ptr;}// 销毁进程锁结构体,利用其memory_addr变量索引到其占用的共享内存并销毁
//            const int destory_mutex_struct(mutex_struct_t * mutex_struct){
//                pthread_mutex_destroy(&(mutex_struct->lock));
//                pthread_mutexattr_destroy(&(mutex_struct->lock_attr));
//                assert(shmctl(mutex_struct->memory_addr,IPC_RMID, nullptr) == 0);
//                return 0;
//            }const int destory_mutex_struct(mutex_struct_t * mutex_struct){pthread_rwlock_destroy(&(mutex_struct->lock));pthread_rwlockattr_destroy(&(mutex_struct->lock_attr));assert(shmctl(mutex_struct->memory_addr,IPC_RMID, nullptr) == 0);return 0;}public:size_t share_memory_id;mutex_struct_t* mutex_struct_ptr;};}//namespace hhh
}//namespace hhh//read file
void read_file(const std::string file_name,int id){std::ifstream fp(file_name,std::ios::binary);std::stringstream ss;ss << fp.rdbuf();std::cout << "线程"<< id << "抢占了资源,输出:" << ss.str() << std::endl;sleep(3);std::cout << "线程"<< id << "释放了资源...\n" << std::endl;fp.close();
}int main(){std::string file_name = "/home/gsc/Projects/1.txt";// 创建自定义进程锁hal::hsm::mutex_function mutex_function_object;mutex_function_object.mutex_struct_ptr = mutex_function_object.mutex_struct_addr(111);// 获取一片共享内存空间int memory_addr = mutex_function_object.create_share_memory_id(222,sizeof (int));volatile int* x = (int*)shmat(memory_addr, 0, 0);// 创建新进程int id = fork();assert(id >= 0);// 设置循环次数const int N = 1000000;// 父进程每次加1,子进程每次加2int i;for (i = 0; i < N; ++i) {if (id > 0) {  // 父进程// 加锁
//            pthread_mutex_lock(&(mutex_function_object.mutex_struct_ptr->lock));
//            pthread_rwlock_rdlock(&(mutex_function_object.mutex_struct_ptr->lock));pthread_rwlock_wrlock(&(mutex_function_object.mutex_struct_ptr->lock));//            int temp = *x;
//            *x = temp+1;read_file(file_name,getpid());// 解锁pthread_rwlock_unlock(&(mutex_function_object.mutex_struct_ptr->lock));} else {  // 子进程// 加锁
//            pthread_mutex_lock(&(mutex_function_object.mutex_struct_ptr->lock));
//            pthread_rwlock_rdlock(&(mutex_function_object.mutex_struct_ptr->lock));pthread_rwlock_wrlock(&(mutex_function_object.mutex_struct_ptr->lock));//            int temp = *x;
//            *x = temp+2;read_file(file_name,getpid());// 解锁
//            pthread_mutex_unlock(&(mutex_function_object.mutex_struct_ptr->lock));pthread_rwlock_unlock(&(mutex_function_object.mutex_struct_ptr->lock));}}// 等待循环完毕sleep(1);// 打印
//    printf("pid= %d, x_address= %x, x= %d\n", getpid(), x, *x);// 等待打印完毕sleep(1);// 销毁进程锁,释放申请的共享内存if (id > 0) {  // 父进程mutex_function_object.destory_mutex_struct((mutex_function_object.mutex_struct_ptr));mutex_function_object.mutex_struct_ptr = nullptr;shmctl(memory_addr, IPC_RMID, nullptr);x = nullptr;printf("父进程释放资源完毕\n");}return 0;
}

将读写锁放到共享内存中,实现进程之间对数据的读写访问控制相关推荐

  1. 将读写锁放到共享内存,实现进程之间对于同一文件的读写操作

    思路 将读写锁和读写锁的属性以及一个用于存储共享内存的地址的int型变量三者封装成一个struct结构 将这个结构体放到共享内存中,以及将读写锁的属性设置成全局性质,然后使用这个属性初始化锁,以及将锁 ...

  2. 转:使用 PHP 直接在共享内存中存储数据集

    概述 共享内存是一种在相同机器中的应用程序之间交换数据的有效方式.一个进程可创建一个可供其他进程访问的内存段,只要它分配了正确的权限.每个内存段拥有一个惟一的 ID(称为 shmid),这个 ID 指 ...

  3. PHP 直接在共享内存中存储数据集

    共享内存是一种在相同机器中的应用程序之间交换数据的有效方式.一个进程可创建一个可供其他进程访问的内存段,只要它分配了正确的权限.每个内存段拥有一个惟一的 ID(称为 shmid),这个 ID 指向一个 ...

  4. 共享内存中出现段错误

    Linux系统编程---共享内存中出现段错误 简述 1.共享内存相关使用 2. 使用上错误示例 3.正确示例 4.思考 简述 关于共享内存中,另一个程序访问时出现段错误的问题,后来在一篇博文中找到了问 ...

  5. python slice是共享内存吗_在共享内存中使用numpy数组进行多处理

    在共享内存中使用numpy数组进行多处理 我希望在共享内存中使用numpy数组,以便与多处理模块一起使用.困难之处在于它像一个numpy数组一样使用,而不仅仅是作为一个ctype数组使用.from m ...

  6. Linux容器间共享内存,C++容器模板在共享内存中的使用

    本文用于探讨在共享内存中使用容器的好处,以及几种在共享内存中C++模板容器的方法. 1 为什么要在共享内存中使用模板容器? 为什么要避开普通内存而选择共享内存,那肯定是使用共享内存的优势: 共享内存可 ...

  7. linux共享内存示例,linux 进程间共享内存示例

    写入端: #include #include #include #include #include using namespace std; struct MappingDataType { int ...

  8. c语言共享内存,在爷儿俩进程间使用共享内存(共享内容含指针)

    在父子进程间使用共享内存(共享内容含指针) 比如有这样一个结构体 #define MAX_QUE_LEN 100 //定义数据包缓存队列 typedef struct _t_pkt_queue { U ...

  9. Linux两个进程交换信息,如何在Linux中的进程之间交换二进制数据

    我需要创建一个可以进行无线网络扫描的linux应用程序,将结果放入一个结构中并以某种方式将其发送到另一个将使用该数据的主应用程序.我最初的想法是在主应用程序中创建一个管道,fork并通过execl启动 ...

最新文章

  1. C语言数组只会输出两个!_只愿与一人十指紧扣_新浪博客
  2. 为什么不同新旧UPS电池不能混用?浮充电压是什么?
  3. 生产环境linux下安装两个及两个以上tomcat实践
  4. 表达式* ptr ++和++ * ptr是否相同?
  5. php管道的概念,管道线的概念定义及分析技巧的讲解
  6. matlab中sqp的算法原理_利用fmincon函数中的SQP算法求解非线性规划问题,模型本身.......
  7. 模块ntdll中出现异常eaccessviolation_SAP ERP软件中的物料凭证 MIGO
  8. 路由器怎么用自己的笔记本电脑进行配置
  9. 企业管理员必看:企业邮箱如何注册?企业邮箱账号怎么管理?
  10. 智能音箱的差评|为什么我要买一堆垃圾回来吃灰!
  11. skynet 热更新
  12. 这姐姐呀的人工智能实训1:机器人语料库数据集准备
  13. 【JAVA进阶篇】时间与日期相关类
  14. DRF中的路由Router使用
  15. python光棍节快乐_2020年光棍节快乐的祝福语5条
  16. Windows 10 开机不一会出现MEMORY_MANAGEMENT蓝屏
  17. html仿写京东左侧,jQuery模仿京东/天猫商品左侧分类导航菜单效果
  18. Redis故障检查:内存问题
  19. 呵呵哒!手把手教你C语言结构体与共同体
  20. junit所需要的jar包

热门文章

  1. php mysql 实现原理_php+mysql分页原理实现
  2. 【转】Postman系列三:Postman中post接口实战(上传文件、json请求)
  3. 深入探究JVM | klass-oop对象模型研究
  4. number 限制最长数字_Java源码阅读-Number
  5. JS 给某个对象添加专属方法
  6. 【FZU - 2254】英语考试(最小生成树,思维,建图)
  7. Linux中wait接口用于延时,linux2.6驱动编写参考
  8. java生成16位随机数_java中如何产生一个16位数字组成的随机字符串?谢谢各位了...
  9. 朋友圈自动回复评论_微信新版,朋友圈可以表情包回复了!网友:评论区斗起来.jpg...
  10. php发扑克牌,php 扑克牌代码的简单例子