c++11中condition_variable信号量的标准用法。

目标:主线程向其它线程发生消息,其它线程收到消息并处理。

伪代码目标:主线程将消息加入listTemp链表,使用condition_variable的notify_one通知线程,其它线程将消息处理,并将消息加入到已处理listTemp2链表中。

 伪代码

#include <atomic>
#include <mutex>
#include <list>
#include <vector>
#include <thread>
#include <cassert>


int main()
{
	std::atomic<int> nNum = ATOMIC_VAR_INIT(0);

	std::mutex listMu;
	std::list<int> listTemp;

	std::mutex listMu2;
	std::list<int> listTemp2;

	std::condition_variable listCondition;

	std::vector<std::shared_ptr < std::thread >> listThread;

	int const nMax = 1000;

	for (int i = 0; i != 10; ++i)
	{
		auto pTh = std::make_shared <std::thread>([&listTemp,&listCondition,&listMu,&nNum,&listTemp2,&listMu2,nMax]
			()->void
		{
			
			while (true)
			{		
				int i = -1;

				{
					std::unique_lock<std::mutex> lc(listMu);
					while (listTemp.empty())
					{
						listCondition.wait(lc);

						{
							std::lock_guard<std::mutex> lc(listMu2);
							if (listTemp2.size() == nMax)
							{
								break;
							}
						}
					}

					{
						std::lock_guard<std::mutex> lc(listMu2);
						if (listTemp2.size() == nMax)
						{
							listCondition.notify_one();
							break;
						}
					}


					i = *listTemp.begin();
					listTemp.erase(listTemp.begin());					
				}
			



				//处理比较耗时的操作


				{
					std::lock_guard<std::mutex> lc(listMu2);
					listTemp2.push_back(i);
					if (listTemp2.size() == nMax)
					{
						listCondition.notify_one();
						break;
					}
				}

				std::this_thread::sleep_for(std::chrono::milliseconds(100));

				

			}
			
		});

		listThread.push_back(pTh);
	}	
		
	for (int i = 0; i != nMax; ++i)
	{
		{
			std::lock_guard<std::mutex> lc(listMu);
			listTemp.push_back(i);
			listCondition.notify_one();
		}		
		std::this_thread::sleep_for(std::chrono::milliseconds(15));
	}		

	//listCondition.notify_all();
	for (auto t : listThread)
	{
		t->join();
	}

	assert(nMax == listTemp2);

	std::cout << "结束" << std::endl;

	getchar();
    return 0;
}

代码保证消息不会有遗漏,并且所有消息都能得到处理。但是并不保证,已处理的消息链表中的顺序与加入消息的顺序一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值