c++ 11 多线线程系列--------使用锁和条件变量的线程安全队列

 c++ 11 多线线程系列--------使用锁和条件变量的线程安全队列

哎哟,自己仔细体会咯,想要拿去用随便好了!!!

#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 

template
class threadsafe_queue
{
private:
	mutable std::mutex mut;
	std::queue data_queue;
	std::condition_variable data_cond;
public:
	threadsafe_queue()
	{}

	void push(T new_value)
	{
		std::lock_guard lk(mut);
		data_queue.push(std::move(new_value));
		data_cond.notify_one();
	}

	void wait_and_pop(T& value)
	{
		std::unique_lock lk(mut);
		data_cond.wait(lk, [this]{return !data_queue.empty(); });
		value = std::move(data_queue.front());
		data_queue.pop();
	}

	std::shared_ptr wait_and_pop()
	{
		std::unique_lock lk(mut);
		data_cond.wait(lk, [this]{return !data_queue.empty(); });
		std::shared_ptr res(
			std::make_shared(std::move(data_queue.front())));
		data_queue.pop();
		return res;
	}

	bool try_pop(T& value)
	{
		std::lock_guard lk(mut);
		if (data_queue.empty())
			return false;
		value = std::move(data_queue.front());
		data_queue.pop();
	}

	std::shared_ptr try_pop()
	{
		std::lock_guard lk(mut);
		if (data_queue.empty())
			return std::shared_ptr();
		std::shared_ptr res(
			std::make_shared(std::move(data_queue.front())));
		data_queue.pop();
		return res;
	}

	bool empty() const
	{
		std::lock_guard lk(mut);
		return data_queue.empty();
	}
};

int main()
{
	threadsafe_queue rq;
}


你可能感兴趣的:(c++,11,多线线程系列)