(8)C++互斥量,条件变量---mutex,condition_variable

互斥量std::metux:锁定资源不被同时访问

条件变量:(1)阻塞线程,等待某条件满足继续往下执行(2)通知其他线程继续执行,因为条件变量在阻塞过程中并不会轮询当前条件的值。也有说是唤醒其他线程的说法,因为等待中的线程是在睡眠状态的,你不去通知他他就一直睡着不起来干活。

#include <iostream>
#include <thread>
#include <windows.h>
#include <string>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <chrono>
int number = 0;

std::mutex mtx;//定义互斥量
std::condition_variable con_var;//定义条件变量
bool flag = true;
void fun1()
{
	
	for (int i = 0; i < 1000; i++)
	{
		std::unique_lock<std::mutex> lck(mtx);
		con_var.wait(lck, [] {return flag; });//条件变量阻塞等待flag为真
		//以下注释的代码跟 con_var.wait(lck, [] {return flag; }); 这句等价的,下面的更好理解
		//while (true)
		//{
		//	if (flag)
		//	{
		//		con_var.notify_one();
		//		break;
		//	}
		//	con_var.wait(lck);

		//	std::this_thread::sleep_for(std::chrono::milliseconds(10));
		//}

		flag = false;
		number++;
		con_var.notify_one();//条件变量通知线程可以继续执行
		std::this_thread::sleep_for(std::chrono::milliseconds(500));
		std::cout << number << std::endl;
	}
}
void fun2()
{
	
	for (int i = 0; i < 1000; i++)
	{
		std::unique_lock<std::mutex> lck(mtx);
		//con_var.wait(lck, [] {return !flag; });
		while (true)
		{
			if (!flag)
			{

				con_var.notify_one();
				break;
			}
			con_var.wait(lck);
			std::this_thread::sleep_for(std::chrono::milliseconds(10));
		}
		flag = true;
		number--;
		//con_var.notify_one();
		std::this_thread::sleep_for(std::chrono::milliseconds(500));
		std::cout << number << std::endl;
	}
}

int main()
{
	std::thread th1(fun1);
	std::thread th2(fun2);
	th1.join();//等待线程执行完成后再执行后续代码
	th2.join();
	//th1.detach();
	//th2.detach(); //直接运行主线程


	system("pause");

	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
互斥条件变量C++ 常用的同步机制,用于在多线程编程控制共享资源的访问和线程间的通信。 互斥Mutex)用于保护共享资源,在访问共享资源之前需要获得互斥锁,访问完毕后需要释放互斥锁。具体使用方法如下: ```c++ #include <mutex> std::mutex mtx; // 定义互斥锁 // 在访问共享资源之前加锁 mtx.lock(); // 访问共享资源 // 在访问共享资源之后释放锁 mtx.unlock(); ``` 条件变量Condition variable)用于线程间的通信,一个线程可以通知另一个线程一些特定的事件已经发生。具体使用方法如下: ```c++ #include <condition_variable> #include <mutex> std::condition_variable cv; // 定义条件变量 std::mutex mtx; // 定义互斥锁 bool flag = false; // 条件变量依赖的标志变 // 线程 1 std::unique_lock<std::mutex> lck(mtx); // 获得互斥锁 while(!flag) cv.wait(lck); // 等待条件变量 // 执行线程 1 的任务 // 线程 2 { std::lock_guard<std::mutex> guard(mtx); // 获得互斥锁 // 执行线程 2 的任务 flag = true; } cv.notify_one(); // 通知条件变量 ``` 在上述代码,线程 1 获得互斥锁后,检查标志变 `flag` 是否满足条件,如果不满足,则进入等待状态,并释放互斥锁;线程 2 在获得互斥锁后,设置标志变 `flag` 为真,并通知条件变量 `cv`,线程 1 得到通知后重新检查标志变,如果满足条件,则执行线程 1 的任务。 需要注意的是,在使用条件变量时,必须获得互斥锁,以避免竞态条件的发生。另外,条件变量的使用通常需要和互斥锁一起使用,以确保线程安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

究极调参工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值