基于多线程并发-STL之条件变量condition_variable

一、适用场景

1、condition_variable类似于信号量机制,实现了线程的等待和唤醒。
否则其中一个线程需要一直(有、无sleep两种情况)查询令一线程状态。
2、建立线程安全队列

二、condition_variable类介绍

1、无线程thread的拷贝、赋值语义

condition_variable(const condition_variable&) = delete;
condition_variable& operator=(const condition_variable&) = delete;

2、唤醒所有阻塞等待的线程

void notify_all() noexcept;

3、唤醒某一个等待的线程

void notify_all() noexcept

4、阻塞等待的同时释放锁(原子操作)

void wait(unique_lock<mutex>& _Lck);

//可添加是否进入或持续阻塞等待判断(函数等)的重载版本
template<class _Predicate>
	void wait(unique_lock<mutex>& _Lck, _Predicate _Pred)
	{
    
    	// wait for signal and test predicate
	while (!_Pred())
		wait(_Lck);
	}

5、包含超时时间的wait接口wait_for和wait_until

enum class cv_status {
    
    	// names for wait returns
	no_timeout,
	timeout
	};
	
cv_status wait_for(unique_lock<mutex>& _Lck,const chrono::duration<_Rep, _Period>& _Rel_time);

//可添加是否进入或持续阻塞等待判断(函数等)的重载版本
//超时直接退出
cv_status wait_for(unique_lock<mutex>& _Lck,const chrono::duration<_Rep, _Period>& _Rel_time,_Predicate _Pred);

三、使用示例代码

#include <mutex>

std::mutex mx;
std::condition_variable cond;
long count = 0;

void wait() {
    
    
	std::unique_lock<std::mutex>lock(mx);
	cond.wait(lock, [&]() {
    
    return count > 0; });
	--count;
}
void signal() {
    
    
	std::unique_lock<std::mutex>lock(mx);
	++count;
	cond.notify_one();
}

int main(int argc, char*argv[])
{
    
    
	std::thread A(wait);
	std::thread B(signal);
	A.join();
	B.join();
	std::cout << count;
	return 0;
}

如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

猜你喜欢

转载自blog.csdn.net/qq_43148810/article/details/128822435