互斥量

举报
无敌清风蓝 发表于 2023/11/22 20:12:04 2023/11/22
【摘要】 1.简介互斥量实际是一个类在同一时间几个线程都尝试去给这个锁头加锁,但只有一个能加上,剩下的线程被卡在lock语句行这里不断尝试,一直加锁成功他们的执行流程才会继续走下去,当加锁的解锁后,其他的才能加锁互斥量原则上是为了保护需要保护的数据 2.应用:互斥量在现实中的应用主要是用于保护共享资源,防止多个任务同时访问该资源,从而避免数据竞争和不一致性。以下是一些具体的应用场景:文件系统:当有多...

1.简介

互斥量实际是一个类

在同一时间几个线程都尝试去给这个锁头加锁,但只有一个能加上,剩下的线程被卡在lock语句行这里不断尝试,一直加锁成功他们的执行流程才会继续走下去,当加锁的解锁后,其他的才能加锁

互斥量原则上是为了保护需要保护的数据

2.应用:

互斥量在现实中的应用主要是用于保护共享资源,防止多个任务同时访问该资源,从而避免数据竞争和不一致性。以下是一些具体的应用场景:

文件系统:当有多个任务需要写入同一个文件时,可以使用互斥量来确保每次只有一个任务可以写入,防止文件内容混乱2。

数据库系统:在数据库操作中,多个事务可能需要访问和修改同一条记录。使用互斥量可以确保每次只有一个事务可以操作该记录,防止数据不一致。

嵌入式系统:在嵌入式系统中,可能有多个任务需要访问同一硬件资源(如I/O端口)。使用互斥量可以确保每次只有一个任务可以访问该硬件资源,防止硬件操作冲突。

操作系统:在操作系统中,互斥量常用于实现进程或线程同步,例如控制对临界区的访问。

并发编程:在并发编程中,互斥量用于保护临界区,防止多线程同时访问共享数据,从而避免数据竞争。

3.具体应用:

我们以一个在线银行系统为例,其中有一个操作是从一个账户转账到另一个账户。

假设我们有两个线程,线程A和线程B,它们都试图从账户1向账户2转账。在没有互斥量的情况下,可能会发生以下情况:

线程A读取账户1的余额(假设为100元)。
线程B也读取账户1的余额(仍为100元)。
线程A从账户1中扣除50元,然后将这50元加到账户2中。
线程B也从账户1中扣除50元,然后将这50元加到账户2中。
结果是,账户1的余额变为0元,而账户2增加了100元。这明显是错误的,因为总金额应该保持不变。
现在,让我们引入一个互斥量来保护转账操作:

线程A获取互斥量的所有权。
线程A读取账户1的余额(100元),从中扣除50元,然后将这50元加到账户2中。
线程A释放互斥量。
现在,线程B获取互斥量的所有权。
线程B读取账户1的余额(现在是50元),从中扣除50元,然后将这50元加到账户2中。
线程B释放互斥量。
通过使用互斥量,我们确保了每次只有一个线程可以执行转账操作。因此,总金额保持不变,这就是正确的结果。

4.代码

头文件

#include <mutex>

在类A中定义一个互斥量(成员变量)

std::mutex my_mutex; //创建互斥量
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。