进程间通信有一种[共享内存]方式,大家有没有想过,这种通信方式中如何解决数据竞争问题?我们可能自然而然的就会想到用锁。但我们平时使用的锁都是用于解决线程间数据竞争问题,貌似没有看到过它用在进程中,那怎么办?
关于进程间的通信方式估计大多数人都知道,这也是常见的面试八股文之一。
个人认为这种面试题没什么意义,无非就是答几个关键词而已,更深入的可能面试官和面试者都不太了解。
关于进程间通信方式我之前在这篇文章中有过介绍,感兴趣的可以移步去看哈。
进程间通信有一种[共享内存]方式,大家有没有想过,这种通信方式中如何解决数据竞争问题
我们可能自然而然的就会想到用锁。但我们平时使用的锁都是用于解决线程间数据竞争问题,貌似没有看到过它用在进程中,那怎么办
我找到了两种方法,信号量和互斥锁。
直接给大家贴代码吧,首先是信号量方式:
代码中的MEOW_DEFER,它内部的函数会在生命周期结束后触发。它的核心函数其实就是下面这四个:
具体含义大家应该看名字就知道,这里的重点就是sem_init中的pshared参数,该参数为1表示可在进程间共享,为0表示只在进程内部共享。
第二种方式是使用锁,即pthread_mutex_t,可是pthread_mutex不是用作线程间数据竞争的吗,怎么能用在进程间呢
可以给它配置一个属性,示例代码如下:
它的默认属性是进程内私有,但是如果给它配置成PTHREAD_PROCESS_SHARED,它就可以用在进程间通信中。
相关视频推荐
360度无死角讲解进程管理,调度器的5种实现
Linux进程间通信-信号量、消息队列和共享内存
学习地址:C/C++Linux服务器开发/后台架构师零声教育-学习视频教程-腾讯课堂
需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括 C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等),免费分享
完整代码如下:
我想这两种方式应该可以满足我们日常开发过程中的大多数需求。
锁的方式介绍完之后,可能很多朋友自然就会想到原子变量,这块我也搜索了一下。但是也不太确定C++标准中的atomic是否在进程间通信中有作用,不过看样子boost中的atomic是可以用在进程间通信中的。
其实在研究这个问题的过程中,还找到了一些很多解决办法,包括:
Disabling Interrupts
Lock Variables
Strict Alternation
Peterson's Solution
The TSL Instruction
Sleep and Wakeup
Semaphores
Mutexes
Monitors
Message Passing
Barriers
这里就不过多介绍啦,大家感兴趣的可以自行查阅资料哈。
解决方法:
取:17 >
互斥锁是信号量的特例。信号量的初始值表示有多少个任务可以同时访问共享资源,如果初始值为1,表示只有1个任务可以访问,信号量变成互斥锁(Mutex)。
1同一时间只能有一个任务持有互斥锁,而且只有这个任务可以对互斥锁进行解锁。
2使用中的互斥锁是不能被重新初始化的。
3并且互斥锁不能用于中断上下文。
mutex结构体
mutex初始化
mutex加锁
mutex解锁
1、mutex初始化
a) 动态初始化
b) 静态初始化
2、mutex加锁
3、mutex解锁
drivers/input/evdevc
unlock之后休眠一下
pthread_mutex_unlock(&mutex); /释放互斥锁/
sleep(1);
pthread1 start running!
pthread2 start running!
gnum=:1
gsub=:99
gnum=:2
gsub=:98
gnum=:3
gsub=:97
gnum=:4
gsub=:96
gnum=:5
Linux中带锁的文件夹图标表示没有权限访问该文件夹。取消linux文件上面的小锁头方法:
1、首先点击任务栏上面的≥,或者是在桌面空白处不要点击任何软件。
2、按一下鼠标右键,选择终端打开。
3、打开终端后看到@前面有个名字,这个就是自己的用户名。
4、接着输入命令:sudochown+名字。
5、把这个带有锁头的文件拖入到命令后面,按键盘回车键。
6、接着输入管理员密码,这锁头就消失不见了。
以上就是关于linux|进程间通信如何加锁全部的内容,包括:linux|进程间通信如何加锁、Linux系统提示无法获得锁/var/lib/dpkg/lock怎么办、6.5 linux内核互斥锁等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)