首页 > 编程语言 >C++ condition_variable

C++ condition_variable

时间:2023-02-27 22:15:17浏览次数:40  
标签:std Pred C++ while 线程 variable include condition wait

一、使用场景

  在主线程中创建一个子线程去计数,计数累计100次后认为成功,并告诉主线程;主线程收到计数100次完成的信息后继续往下执行

二、条件变量的成员函数

wait:当前线程调用 wait() 后将被阻塞,直到另一个线程调用 noteify() 唤醒当前线程,使其被阻塞的线程继续运行。

①void wait(unique_lock<mutex>& _Lck)();

②template <class _Predicate>

void wait(unique_lock<mutex>& _Lck, _Predicate _Pred) ;

_Pred : wait 的预测条件,

只有当 _Pred 为 false 且获取锁后调用 wait() 才会阻塞当前线程;

只有当 _Pred 为 true 且获取锁后 收到唤醒通知后 才会解除阻塞;

 

wait_for:可以指定一个时间段,在当前线程收到唤醒通知或指定的时间超时之前,该线程都会处于阻塞状态;超时或收到线程通知后返回

enum class cv_status { 
no_timeout,
timeout };

①cv_status wait_for(unique_lock<mutex>& _Lck, const chrono::duration<_Rep, _Period>& _Rel_time) ;

②template <class _Rep, class _Period, class _Predicate>
bool wait_for(unique_lock<mutex>& _Lck, const chrono::duration<_Rep, _Period>& _Rel_time, _Predicate _Pred);

_Rel_time:等待的时间段,_Pred : wait_for的预测条件

当 _Pred 为 true   时,立刻唤醒线程,返回 true(_Pred 的状态),无需等待超时时间; 

当 _Pred 为 false 时,超过指定时间段未收到 notify_one 信号,唤醒线程,返回 false

定时间段内收到 notify_one 信号时,取决于_Pred 的状态,若为 _Pred 为 false,线程依然阻塞,返回 false(_Pred 的状态)

三、使用方法

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

int main()
{
  /************************可以作为 While 的条件**************************/
  int i = 0;
  bool while_Out = false;
  std::mutex while_mtx;
  std::condition_variable while_cv;
  std::unique_lock<std::mutex>guard(while_mtx);
  while (while_cv.wait_for(guard, std::chrono::milliseconds(10), [&] {return while_Out == true; }) == false)
  {//当 while_Out 为 false 时,等待 10ms,返回 false,进入 while 循环
    if (i == 50)
    {
        while_Out = true;//当 while_Out 为 true 时,下次进行 wait_for 时无需等待超时时间,立刻返回 true ,结束循环
        while_cv.notify_one();//因为是同步,所以 notify_one 没有作用,要先走完 while
    }
    i++;
    std::cout << i << std::endl;//所以会输出51
  }
  std::cout << "test finish" << std::endl;
  /************************可以作为 While 的条件**************************/
  return 0;
}

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <condition_variable>
#include <ctime>
#include <thread>
#include <iomanip>

void Get_time()
{
	std::time_t newTime = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
	auto formatTime = std::put_time(std::localtime(&newTime), "%Y-%m-%d %X");
	std::cout << "current time= " << formatTime << std::endl;
}

bool g_Out = false;
std::mutex g_mtx;
std::condition_variable g_cv;

void test()
{
	int i = 0;
	while (true)
	{
		i++;
		if (i == 50)
		{
			Get_time();
			g_Out = true;
			g_cv.notify_one();
			std::cout << " 唤醒主线程" << std::endl;
		}
	}
}

int main()
{
	g_Out = false;//阻塞主线程
	std::thread t1(test);
	t1.detach();
	std::unique_lock<std::mutex>guard(g_mtx);
	Get_time();
	std::cout << " 阻塞主线程" << std::endl;
	int ret = g_cv.wait_for(guard, std::chrono::minutes(1), [&] {return g_Out == true; });
 	std::cout << ret << std::endl;
	//当 _Pred == false 时,在指定时间段(1分钟)内进入阻塞状态,
	//如果一直未接收到 notify_one 信号则超时唤醒线程,返回 _Pred 值
	//如果中途接收到 notify_one 信号:
	//①_Pred == true 则唤醒线程,返回 true;
	//②_Pred == false 则依然阻塞线程,直至超时返回 _Pred 值;
	return 0;
}

  

 

  

  

标签:std,Pred,C++,while,线程,variable,include,condition,wait
From: https://www.cnblogs.com/huweide/p/17153193.html

相关文章

  • C++ 文件知识
    #include"iostream"#include"filesystem"#include"fstream"intcount=0;std::stringMessage="";//读取文件内容,C风格intReadFile(char*FileName,char*......
  • C++调试环境的建立(仅适合初学者,高手莫入)
    近日,发现光用C#还是不行,毕竟许多老代码都是C++等其他语言写的,所以决定学C++。作为初学者,连编译环境等都不了解,问了一些高手,他们推荐N多编译器,我晕了(云里来雾里去的,一点不过......
  • C/C++数据结构课程设计任务书[2023-02-27]
    C/C++数据结构课程设计任务书[2023-02-27]文华学院数据结构课程设计任务书一、 课程设计题目1. 家谱管理系统的设计与实现实现对某家族成员信息的管理,包含建......
  • C++ 遍历目录
    单层遍历目录(无递归):#include<filesystem>namespacefs=std::filesystem;constfs::pathpathToShow{argc>=2?argv[1]:fs::current_path()};for(cons......
  • C++ STL容器
    STL容器STL容器主要有,动态数组vector,循环双向链表list,双端队列deque,栈stack,Vector容器#include<vector>//头文件vector<int>a;//定义了一个int类型的vector......
  • 如何选择Python与C++之间的胶水:Boost.Python,Cython,pybind11,SWIG
    Python作为一门胶水语言,它与C/C++之间的兼容性(Interoperability)我认为是它相比其他动态语言脱颖而出的最大原因。Python原生支持的是与C语言的接口,Python的发行版自带有Pyt......
  • springboot条件注册Condition注解
    环境识别importorg.springframework.context.annotation.Condition;importorg.springframework.context.annotation.ConditionContext;importorg.springframework.c......
  • C++ 截图、操作鼠标移动左键单击、操作键盘、ocr识图、获取system函数的结果
    ocr识别是使用tesseract来搞得,因为tesseract的编译太麻烦了,就通过system直接命令行识别了在通过读取命令行界面的字符获取结果的。//键盘和对应按键值的映射std::map<w......
  • c++中内联函数和宏函数的区别
    一.区别:是不是函数:宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率;内联函数本质上是一个函数,内联......
  • c++函数指针
    一.定义介绍1.1定义如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这......