linux|进程间通信如何加锁

linux|进程间通信如何加锁,第1张

进程通信有一种[共享内存]方式,大家有没有想过,这种通信方式中如何解决数据竞争问题?我们可能自然而然的就会想到用锁。但我们平时使用的锁都是用于解决线程间数据竞争问题,貌似没有看到过它用在进程中,那怎么办?

关于进程间的通信方式估计大多数人都知道,这也是常见的面试八股文之一。

个人认为这种面试题没什么意义,无非就是答几个关键词而已,更深入的可能面试官和面试者都不太了解。

关于进程间通信方式我之前在这篇文章中有过介绍,感兴趣的可以移步去看哈。

进程间通信有一种[共享内存]方式,大家有没有想过,这种通信方式中如何解决数据竞争问题

我们可能自然而然的就会想到用锁。但我们平时使用的锁都是用于解决线程间数据竞争问题,貌似没有看到过它用在进程中,那怎么办

我找到了两种方法,信号量和互斥锁。

直接给大家贴代码吧,首先是信号量方式:

代码中的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内核互斥锁等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9870128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存