日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将读写锁放到共享内存中,实现进程之间对数据的读写访问控制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

代碼

#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>/*** 返回一片共享內(nèi)存標(biāo)識符,用于后續(xù)獲取該共享內(nèi)存,以及銷毀該共享內(nèi)存* file_name* md5*/ namespace hhh{namespace hhh{class mutex_function{public:mutex_function() = default;// 定義進(jìn)程鎖結(jié)構(gòu)體 // 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;}}// 初始化進(jìn)程鎖結(jié)構(gòu)體 // 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;}// 在共享內(nèi)存上定義進(jìn)程鎖結(jié)構(gòu)體并且返回其位置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;}// 銷毀進(jìn)程鎖結(jié)構(gòu)體,利用其memory_addr變量索引到其占用的共享內(nèi)存并銷毀 // 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";// 創(chuàng)建自定義進(jìn)程鎖hal::hsm::mutex_function mutex_function_object;mutex_function_object.mutex_struct_ptr = mutex_function_object.mutex_struct_addr(111);// 獲取一片共享內(nèi)存空間int memory_addr = mutex_function_object.create_share_memory_id(222,sizeof (int));volatile int* x = (int*)shmat(memory_addr, 0, 0);// 創(chuàng)建新進(jìn)程int id = fork();assert(id >= 0);// 設(shè)置循環(huán)次數(shù)const int N = 1000000;// 父進(jìn)程每次加1,子進(jìn)程每次加2int i;for (i = 0; i < N; ++i) {if (id > 0) { // 父進(jìn)程// 加鎖 // 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 { // 子進(jìn)程// 加鎖 // 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));}}// 等待循環(huán)完畢sleep(1);// 打印 // printf("pid= %d, x_address= %x, x= %d\n", getpid(), x, *x);// 等待打印完畢sleep(1);// 銷毀進(jìn)程鎖,釋放申請的共享內(nèi)存if (id > 0) { // 父進(jìn)程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("父進(jìn)程釋放資源完畢\n");}return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的将读写锁放到共享内存中,实现进程之间对数据的读写访问控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。