互斥量
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; //创建互斥量
- 点赞
- 收藏
- 关注作者
评论(0)