简述condition_variable的用法

       condition在英文的解释为条件,variable为变量,综合在一起即条件变量。我是个小白,对这个很陌生,感觉可移植性太高了,并没有清晰的概念。只能划个框架,它在这个专栏里,所以它与C++多线程有关。简化处理,这个库函数就是专门处理多线程之间对程序的占用的,类似红绿灯。一个灯有红绿黄三个变量,每个变量作为不同的条件传出不同的信息使人们做出不同的判断。即为条件发出者,控制多线程调度的一个库函数。

      在C++码源中仅有一个condition_variable是不够的,我也不知为啥。语法中还需要与mutex等进行交互。因为我在实际编码中未牵涉到condition_variable_any,将其简化处理。有condition_variable必有mutex与之进行交互,从而控制线程。

      我看了其它的代码,其中在多线程中基本有一段

std::condition_variable cond;

      查看了这个std::condition_variable后,基本懵了。它属于mutex.h。怀疑人生了,既然condition_variable在mutex中,那#include 弄了个寂寞。然后我默默删去了这句#include,程序正常运行。我用的是VS2017,如有指点欢迎赐教。。在mutex.h中condition_variable是一个类

class condition_variable
	{	// class for waiting for conditions
public:
	...
	void notify_one() noexcept
		{	// wake up one waiter
		_Cnd_signalX(_Mycnd());
		}

	void notify_all() noexcept
		{	// wake up all waiters
		_Cnd_broadcastX(_Mycnd());
		}

	void wait(unique_lock& _Lck)
		{	// wait for signal
		// Nothing to do to comply with LWG 2135 because std::mutex lock/unlock are nothrow
		_Cnd_waitX(_Mycnd(), _Lck.mutex()->_Mymtx());
		}

	template
		void wait(unique_lock& _Lck, _Predicate _Pred)
		{	// wait for signal and test predicate
		while (!_Pred())
			wait(_Lck);
		}
	...
	};

        condition_variable这个类比较长,我简化了。将一些模板,寄存器等等我看不明白的先丢到一边。留下了三个内函数即notify_one(),notify_any(),wait()和它的一个模板。水平有限,不管细节,到此够用,如有补充,欢迎赐教。总结出condition_variable与mutex大概有三种用法,如源代码所示,notify_one()为wake up one waiter,即唤醒一个等待者;notify_any()唤醒所有等待者;wait()使线程等待。

你可能感兴趣的:(C++并发编程,C++)