C++ 同步与互斥案例

C++ 同步与互斥案例,第1张

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


互斥

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

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

同步

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

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

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

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

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

sm.acquire();
消费者消费

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

  • 单生产者和单消费者问题
  • 多生产者与多消费者问题
  • 哲学家进餐问题
  • 等等

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

原文地址: http://www.outofmemory.cn/langs/3002072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存