当前位置: 首页 > 科技观察

冷门知识点:如何锁定进程间通信?

时间:2023-03-13 14:41:49 科技观察

这是【每日一问】专栏的第三个问题,如图:Process之间的沟通方式,大部分人大概都知道,这也是常见的面试刻板印象之一。我个人觉得这种面试题没什么意义,无非就是回答几个关键词,面试官和面试官可能理解的不深入。之前在【这篇文章】中介绍过进程间通信方式及其优缺点。如果你有兴趣,你可以去看看。进程间通信有一种【共享内存】的方法。有没有想过如何解决这种通讯方式的数据竞争问题?我们可能很自然地想到使用锁。但是我们平时使用的锁都是用来解决线程间数据竞争的问题。好像我们从来没见过它用在一个进程中。我们应该做什么?我找到了两种方法,信号量和互斥量。直接给大家贴代码吧,首先是信号量方式:#include#include#include#include#include#include#include#include#include#includeconstexprintkMappingSize=4096;voidsem(){constchar*地图名="/地图名";intmapfd=shm_open(mapname,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);MEOW_DEFER{如果(mapfd>0){关闭(mapfd);mapfd=0;}shm_unlink(地图名称);};if(mapfd==-1){perror("shm_open失败\n");退出(退出失败);}if(ftruncate(mapfd,kMappingSize)==-1){perror("ftruncate失败\n");退出(退出失败);}void*sp=mmap(nullptr,kMappingSize,PROT_READ|PROT_WRITE,MAP_SHARED,mapfd,0);if(!sp){perror("mmap失败\n");退出(退出失败);}sem_t*互斥量=(sem_t*)sp;if(sem_init(mutex,1,1)!=0){perror("sem_init失败\n");退出(退出失败);}MEOW_DEFER{sem_destroy(mutex);};int*num=(int*)((char*)sp+sizeof(sem_t));intcid,proc_count=0,max_proc_count=8;for(inti=0;i0){关闭(mapfd);mapfd=0;}shm_unlink(地图名称);};if(mapfd==-1){perror("shm_open失败\n");退出(退出失败);}if(ftruncate(mapfd,kMappingSize)==-1){perror("ftruncate失败\n");退出(退出失败);}void*sp=mmap(nullptr,kMappingSize,PROT_READ|PROT_WRITE,MAP_SHARED,mapfd,0);if(!sp){perror("mmap失败\n");退出(退出失败);}pthread_mutex_t*mutex=(pthread_mutex_t*)sp;pthread_mutexattr_tmutexattr;pthread_mutexattr_init(&mutexattr);pthread_mutexattr_setpshared(&mutexattr,PTHREAD_PROCESS_SHARED);pthread_mutex_init(mutex,&mutexattr);MEOW_DEFER{pthread_mutexattr_destroy(&mutexattr);pthread_mutex_destroy(mutex);};int*num=(int*)((char*)sp+sizeof(pthread_mutex_t));intcid,proc_count=0,max_proc_count=8;for(inti=0;i