C++多线程编程(第三章 案例2,条件变量,生产者-消费者模型)

目录

1、condition_variable

等待中,增加了时延和开销,用条件变量就很快及时处理

1.1、生产者消费者模型

生产者和消费者共享资源变量(list队列);

生产者生产一个产品,通知消费者消费;

消费者阻塞等待信号,获取信号后消费产品(取出list队列中数据)

1.2、改变共享变量的线程步骤

准备好信号量

bash 复制代码
std::condition_variable cv;

1、获取std::mutex(常用std::unique_lock)

bash 复制代码
unique_lock lock(mux);

2、在获取锁时进行修改;

bash 复制代码
msgs_.push_back(data);

3、释放锁并通知读取线程

bash 复制代码
lock.unlock();
cv.notify_one();//通知一个等待信号线程
cv.notify_all;//通知所有等待信号线程

1.3、等待信号读取共享变量的线程步骤

1.3.1、获得改变共享变量线程共同的mutex

unique_lock lock(mux);

1.3.2、wait()等待信号通知

1.3.2.1、无lambda表达式
cpp 复制代码
//解锁lock,并阻塞等待notify_one notify_all 通知
cv.wait(lock);

//接收到通知会再次获取锁标注,也就是说如果此时mux资源被占用,wait函数会阻塞
msgs_front();
//处理数据
msgs_pop_front();
1.3.2.2 lambda表达式
bash 复制代码
cv.wait(lock,[]{return !msgs_empty();})

只在std::unique_lockstd::mutex上工作的std::condition_variable

样例代码

cpp 复制代码
#include <thread>
#include <iostream>
#include <mutex>
#include <list>
#include <string>
#include <sstream>

using namespace std;
list<string> msgs_;
mutex mux;
condition_variable cv;//条件变量

void ThreadWrite()
{
	for (int i = 0;;i++)
	{
		stringstream ss;
		ss << "Write msg " << i;

		unique_lock<mutex> lock(mux);

		msgs_.push_back(ss.str());
		lock.unlock();//解锁
		cv.notify_one();//通知一个

		this_thread::sleep_for(1ms);
	}
}
void ThreadRead(int i)
{
	for (;;)
	{
		cout << "Read msg" << endl;
		unique_lock<mutex> lock(mux);
		cv.wait(lock);//解锁、阻塞等待信号

		mambda表达式方式
		//cv.wait(lock, [i]
		//{
		//	cout << i << " wait" << endl;//特别这句话在啥时候会进入,调用多少次,搞不清楚就用上面cv.wait更简单
		//	//return true;//只要返回true,wait就不会阻塞
		//	return !msgs_.empty();
		//	
		//	});

		//获取信号后锁定
		while (!msgs_.empty())
		{

			cout << i << "read " << msgs_.front() << endl;
			msgs_.pop_front();
		}
		if (msgs_.empty()) return;
	}
}

int main()
{

	thread th(ThreadWrite);
	th.detach();
	for (int i = 0; i < 3; i++)
	{//读取线程
		thread th2(ThreadRead,i+1);
		th2.detach();
	}

	getchar();
	return 0;
}

期间出差了一个月,没有时间学习,今天开始又继续学习和做笔记了...

辉2023.9.8

相关推荐
运器12334 分钟前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程
岁忧35 分钟前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
whoarethenext1 小时前
使用 C++ 实现 MFCC 特征提取与说话人识别系统
开发语言·c++·语音识别·mfcc
R-G-B1 小时前
【MFC】Combobox下拉框中4个选项,运行后点击下拉框选项不能全部展示出来,只能显示2个选项,需要垂直滚动条滚动显示其余选项
c++·mfc
ITfeib1 小时前
Flutter
开发语言·javascript·flutter
想躺平的咸鱼干2 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
Owen_Q2 小时前
Denso Create Programming Contest 2025(AtCoder Beginner Contest 413)
开发语言·算法·职场和发展
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
视觉人机器视觉3 小时前
Visual Studio2022和C++opencv的配置保姆级教程
c++·opencv·visual studio
liulilittle3 小时前
C++ i386/AMD64平台汇编指令对齐长度获取实现
c语言·开发语言·汇编·c++