C++ 同步与互斥案例

阅读本文章前默认你已接触了多线程并有过简单的使用。若有不足也欢迎指出。


互斥

解释: 互斥通常是指临界资源(同时只允许一个线程操作的共享资源)访问的互斥。某些情况下临界资源的访问如果不进行互斥限制,则有可能产生脏读脏写的问题。
互斥的使用:

  1. 引入头文件
#include <mutex>
  1. 定义互斥量
mutex mtx;
  1. 给临界资源上锁与解锁
mtx.lock();
临界资源
mtx.unlock();

同步

解释: 同步通常是指线程间的同步,要求线程1先执行线程2后执行(就如同先做饭后吃饭且不能颠倒)。若多线程并发执行时未考虑本应考虑的线程同步问题,程序会发生不可预料的错误。
同步的使用:
注:信号量机制是C++20后支持的操作,注意调整编译器支持的C++版本

  1. 引入头文件
#include <semaphore>
  1. 定义信号量
std::counting_semaphore sm(0);

信号量:初始值设为0,若信号量执行release()操作,则信号量+1;若信号量执行acquire()操作,则信号量-1;若信号量执行了acquire()操作后小于1,则线程阻塞并加入阻塞队列。直到信号量被执行了release()操作,操作系统会从阻塞队列中恢复最先进入阻塞队列的一个线程。
注:互斥量为最简单的二元信号量,初始值为1。

  1. 控制线程同步(P/V操作)
//生产者线程

生产者生产
sm.release(); 
//消费者线程

sm.acquire();
消费者消费

由线程的同步与互斥引出的经典问题还有许多,感兴趣可以深入研究。如:

  • 单生产者和单消费者问题
  • 多生产者与多消费者问题
  • 哲学家进餐问题
  • 等等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值