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

代码

#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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android WebView 使用漏洞

目录一、类型二、具体分析2.1、WebView任意代码执行漏洞2.1.1、addJavascriptInterface 接口引起远程代码执行漏洞漏洞产生原因解决方案关于该方法的其他细节总结2.1.2、searchBoxJavaBridge_接口引起远程代码执行漏洞漏洞产生原因解决方案2.1.3、accessibility和 accessibilit…

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

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

Android Studio 查看页面布局层次结构

Android Studio有个可以查看手机上app页面布局层次结构的工具。可以协助我们对布局进行优化&#xff0c;去掉没有必要的节点等&#xff0c;通过这个工具可以清晰的看见页面整个结构&#xff1b;废话少说直接上图&#xff0c;再说过程。 这就是我们想要看到的&#xff0c;每个节…

Java web后端 第一章框架搭建

Redis 通用Mapper 通用Mapper->MyBatis动态SQL封装包,增删改查 0 SQL语句 PageHelper PageHelper–>实现分页操作,不需要limit,直接使用静态方法 电商系统技术特点 分布式(数据很多,一台电脑存储一部分数据) 高并发,集群(并发量很高,后台不只一个电脑) ,海量数据 主…

进程锁 读写文件的小例子 C++代码

代码 #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <cassert> #include <pthread.h> #include <cstdio> #include <cstdlib> #include <fstream> #include <io…

Java 中sleep()与wait()的区别

目录一、原理不同二、锁的处理机制不同三、使用的区域不同四、异常捕获不同五、总结一、原理不同 sleep()是Thread类的静态方法&#xff0c;是线程用来控制自身流程的&#xff0c;它会使此线程暂停执行指定的时间&#xff0c;而把执行机会让给其他的线程&#xff0c;等到计时时…

android--地图定位打卡

获取位置信息 1)位置信息 GPS卫星定位,在室外适用 基站(3个基站交叉,锁定手机位置)–基站定位不平均,有些地方实现不了3点定位 网络定位–通过手机IP地址,去锁定位置(消耗流量,对网络有要求) 谷歌地图的大致实现思路(通用) 2)实现定位功能的重要类 在百度地图和高德地图中不…

Android 将整形颜色值转换成String类型

转换方法&#xff1a; val hexColor String.format("#%06X", [0xFFFFFF or intColor]);转换结果&#xff1a; #F2EADA

MacOS 的 zsh 和 bash 切换

目录一、从 bash 切换到 zsh1、使用系统自带的 zsh2、使用第三方的 zsh2.1、Clone代码到本地2.2、备份你已存在的 ~/.zshrc 文件2.3、新建一份新的 zsh 配置文件2.4、改变默认的shell脚本二、从 zsh 切换回 bash三、zsh 和 bash 的环境变量zsh、bash 都是shell&#xff0c;zsh …

android--在命令行中生成Android的数字证书keystore文件

标题 生成 密钥口令为 13458977480 密钥库口令为 13458977480 存放位置 查看证书的相关资料

linux查看系统日志

cd /var/log/gscubuntu:/var/log$ tail -f syslog

IDEA 创建 SpringBoot 项目

目录一、新建Springboot项目第一步&#xff1a;新建一个Springboot项目第二步&#xff1a;选择项目模板第三步&#xff1a;设置项目配置第四步&#xff1a;设置项目依赖第五步&#xff1a;设置项目名称及路径第六步&#xff1a;创建完成二、测试及运行1、测试代码2、设置默认端…

VC++软件

一个main fatal error LNK1169: 找到一个或多个多重定义的符号–报错 一个项目即一个程序&#xff0c;多个文件只能有一个main函数 删除掉多余的main 控制台按enter键闪退 在代码中加上 #include<stdlib.h> getchar();//让控制台停留 system("pause");//让…

IDEA 将 SpringBoot 项目打包成jar

目录一、打包配置1、File -> Project Structure2、Project Structure3、设置启动类及META-INF4、设置打包输出目录二、打包1、Build -> Artifacts2、Build三、查看打包文件四、运行新建SpringBoot项目&#xff1a;IDEA 创建 SpringBoot 项目 一、打包配置 1、File -> …

2014年考研英语一完型填空知识点

单词 单词释意commitv犯罪sufficientlyadv足够gainfuladj有收益的socioeconomicadj社会经济的discontentn/v不满意householdn家庭supervisionn监督offensiveadj冒犯的conditionn状态casualadj随意的causaladj因果关系的establishedadj已确立,公认的interactionn相互作用或影响…

如何查看软连接,以及相关注意事项

使用命令 ls -il 图片显示 参考链接 Linux 命令之软连接详解Linux软连接 查看/创建/删除

Git SSH key配置

一、检查本地Git配置 用如下命令&#xff08;如未特别说明&#xff0c;所有命令均默认在Git Bash工具下执行&#xff09;检查一下用户名和邮箱是否配置&#xff08;github支持我们用用户名或邮箱登录&#xff09;&#xff1a; git config --global --list 显示信息如下&#…

2014年英语一阅读理解Text1

单词解释chancellorn总理upfrontadj坦率的eligibleadj有资格的,合格的fortnightlyadv两星期一次的sign on办理reformn改革subsidisev补助zealn热情taxpayern纳税人claimantn(因失业)领取救济金者skip down边跳边走prospectn前景psychologicallyadv心理上地excludev不包括crucia…

HTTPS 工作原理

一、简介 HTTPS对于客户端开发人员来说并没有什么需要特别注意的地方&#xff0c;因为代码和写HTTP请求时并没有什么两样。但也正是因为这个原因&#xff0c;导致许多客户端开发人员对HTTPS并不了解&#xff0c;只知道它是安全的加密网络传输&#xff0c;对其具体的工作原理却一…