阅读本文章前默认你已接触了多线程并有过简单的使用。若有不足也欢迎指出。
互斥
解释: 互斥通常是指临界资源(同时只允许一个线程 *** 作的共享资源)访问的互斥。某些情况下临界资源的访问如果不进行互斥限制,则有可能产生脏读脏写的问题。
互斥的使用:
- 引入头文件
#include
- 定义互斥量
mutex mtx;
- 给临界资源上锁与解锁
mtx.lock();
临界资源
mtx.unlock();
同步
解释: 同步通常是指线程间的同步,要求线程1先执行线程2后执行(就如同先做饭后吃饭且不能颠倒)。若多线程并发执行时未考虑本应考虑的线程同步问题,程序会发生不可预料的错误。
同步的使用:
注:信号量机制是C++20后支持的 *** 作,注意调整编译器支持的C++版本
- 引入头文件
#include
- 定义信号量
std::counting_semaphore sm(0);
信号量:初始值设为0,若信号量执行release() *** 作,则信号量+1;若信号量执行acquire() *** 作,则信号量-1;若信号量执行了acquire() *** 作后小于1,则线程阻塞并加入阻塞队列。直到信号量被执行了release() *** 作, *** 作系统会从阻塞队列中恢复最先进入阻塞队列的一个线程。
注:互斥量为最简单的二元信号量,初始值为1。
- 控制线程同步(P/V *** 作)
//生产者线程
生产者生产
sm.release();
//消费者线程
sm.acquire();
消费者消费
由线程的同步与互斥引出的经典问题还有许多,感兴趣可以深入研究。如:
- 单生产者和单消费者问题
- 多生产者与多消费者问题
- 哲学家进餐问题
- 等等
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)