C++多线程通信

条件变量condition_variable

wait()是condition_variable的成员函数

void wait (unique_lock& lck)会无条件的阻塞当前线程然后等待通知,前提是此时对象lck已经成功获取了锁。等待时会调用lck.unlock()释放锁,使其它线程可以获取锁。一旦得到通知(由其他线程显式地通知),函数就会释放阻塞并调用lck.lock(),使lck保持与调用函数时相同的状态。然后函数返回,注意,最后一次lck.lock()的调用可能会在返回前再次阻塞线程。

using namespace std;

class A {
private:
	list<int> my_List;
	mutex my_Mutex;
	condition_variable my_Condition;
public:
	void InMes() {
		for (int i = 0;i < 100000;i++) {
			unique_lock<mutex> myulock(my_Mutex);
			my_List.push_back(i);
			cout << "向列表中插入了元素:" << i << endl;
			my_Condition.notify_all();
		}
	}
	void OutMes() {
		for(int i =0;i<100000;i++) {
			unique_lock<mutex> myulock(my_Mutex);
			while (my_List.empty()) {
				my_Condition.wait(myulock);
			}
			my_List.pop_front();
			cout << "从队列中弹出了第"<<i<<"个元素" << endl;
		}
	}
};
int main() 
{
	A* TestClass = new A();
	thread myobj1(&A::InMes,TestClass);
	thread myobj2(&A::OutMes,TestClass);
	myobj1.join();
	myobj2.join();
	return 0;
}

wati()函数因为没有条件判断,因此有时候会产生虚假唤醒,而有条件的等待可以很好的解决这一问题。

void wait (unique_lock& lck, Predicate pred)为有条件的等待,pred是一个可调用的对象或函数,它不接受任何参数,并返回一个可以作为bool计算的值。当pred为false时wait()函数才会使线程等待,在收到其他线程通知时只有当pred返回true时才会被唤醒。我们将上述代码做如下修改,它的输出与上述一样。

wait_for(unique_lock,std::chrono)当前线程收到通知或指定时间超时前,都会一直阻塞
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值