user-0 提问: 线程互斥锁和条件变量实现特殊的生产者和消费者，要求消费者节省cpu

回复:
user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:《Windows核心编程》 有人向庖丁求解牛技巧，庖丁建议他去把动物世界看一遍 他回来之后发现自己成了赵忠祥

user: user-1
content: 《Windows核心编程》

user: user-2
content: 手快打错了 ，是unordered_map<int, vector<policy>>

user: user-0
content: 引用 2 楼 user-6 的回复:加入策略的时候先做分类？每个消费者只关注其兴趣的类别 你的意思是分类将策略存进不同的策略池，然后每个消费者去访问其中一个策略池吗？ 你的办法相当nice啊 我试试

user: user-2
content: 这个池的应该是一个unordered_multimap<int, vector<policy>>而不应该是vector,这样方便插入和查询。当然里面的vector<policy>也可以考虑用queue，看你的需求

user: user-3
content: 引用 14 楼 u010424605 的回复:[quote=引用 10 楼 lincolnandlinda 的回复:]  楼主的实现思路有一个问题, 每个消费者都会在适当的时刻去遍历那个生产者-消费者对列. 其实没这个必要, 我的想法是做四个对列, 第一个对列实现对所有策略依据ModuleID进行分发, 分别向另外三个对列中放入对应ID的策略.每个对应的消费者实现各自的处理流程. 这样每个生产者-消费者的对列的实现就简单很多(只需要用条件数进行等待即可), 而且方便进行类的封装. 如果楼主是在Windows平台, 可以使用MS的提供的Concurrency runtime , 库里面提供了Aynchronous message blocks, 可以很方便实现消息的过滤, 我以前做过一个项目就是用这个整的, 很容易. 这个想法之前有位仁兄也说了，不过描述没有您这么具体，这个思路确实很好，正考虑替换现有方案。 ps. 我是在linux下做的，windows的没怎么接触过。[/quote]  思想是一致的。只是接口不同。用自己熟悉的环境即可，这样得心应手

user: user-3
content: 引用 9 楼 u010424605 的回复:[quote=引用 8 楼 my_live_123 的回复:] 把消费者代码的倒数2，3注释掉！这两句wait和signal我觉得是多余的。 这样如果策略池不为空，并且里面的策略不是这个线程所需要的，那么这个线程就会一直循环来查询。 添加这两句在单个线程是可以把这个线程阻塞住的，但如果有多个线程的话，会互相signal那么wait的效果就没有了。[/quote]  不同的消费着消费不同的资源，如果不多，那么查询自己的策略，只是循环一次O(n)的开销，有就拿，没有就继续阻塞！ 如果策略非常多，遍历开销很明显，那么就把策略队列拆分，不同策略不同的队列。然后每个资源队列单独的同步控制。这样锁的范围变小,控制也更精确

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:[quote=引用 7 楼 u010424605 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] 《Windows核心编程》 有人向庖丁求解牛技巧，庖丁建议他去把动物世界看一遍 他回来之后发现自己成了赵忠祥[/quote] 有人向冯诺依曼求解编程技巧，冯诺依曼建议他去研究图灵机 他回来之后发现自己成了比尔盖茨。 [/quote] 您还挺喜欢跟人争论的嘛

user: user-0
content: 引用 13 楼 xihu1364 的回复:弄多少个线程，并且哪些线程做哪些策略，就传参nStrategy 之前的moduleId就是传进来的参数，跟前面的仁兄想法差不多，thank you！

user: user-0
content: 引用 10 楼 lincolnandlinda 的回复:楼主的实现思路有一个问题, 每个消费者都会在适当的时刻去遍历那个生产者-消费者对列. 其实没这个必要, 我的想法是做四个对列, 第一个对列实现对所有策略依据ModuleID进行分发, 分别向另外三个对列中放入对应ID的策略.每个对应的消费者实现各自的处理流程. 这样每个生产者-消费者的对列的实现就简单很多(只需要用条件数进行等待即可), 而且方便进行类的封装. 如果楼主是在Windows平台, 可以使用MS的提供的Concurrency runtime , 库里面提供了Aynchronous message blocks, 可以很方便实现消息的过滤, 我以前做过一个项目就是用这个整的, 很容易. 这个想法之前有位仁兄也说了，不过描述没有您这么具体，这个思路确实很好，正考虑替换现有方案。 ps. 我是在linux下做的，windows的没怎么接触过。

user: user-4
content: 弄多少个线程，并且哪些线程做哪些策略，就传参nStrategy

user: user-4
content: //将这些不同的策略分开，用不同的队列，否则就是用链表了，不是先进先出的方式 queue<char*> queue1;  queue<char*> queue2;  queue<char*> queue3;   void work_thread(int nStrategy) { 	while (1) 	{ 		switch (nStrategy) 		{ 		case 1: 			{ 				char* pstr;  				//queue1是一个同步队列，pop节点是 等待信号的方式，参数0为超时时间  （这样的队列可以自己去实现） 				if (queue1.wait_queue(pstr,0)) 				{ 					//deal pstr; 				} 				break; 			} 		case 2: 			{ 				char* pstr;  				//queue1是一个同步队列，pop节点是 等待信号的方式，参数0为超时时间  （这样的队列可以自己去实现） 				if (queue2.wait_queue(pstr,0)) 				{ 					//deal pstr; 				} 				break; 			} 		case 3: 			{ 				char* pstr;  				//queue1是一个同步队列，pop节点是 等待信号的方式，参数0为超时时间  （这样的队列可以自己去实现） 				if (queue3.wait_queue(pstr,0)) 				{ 					//deal pstr; 				} 				break; 			} 		default: 			{ 				break; 			} 		} 	} }

user: user-1
content: 引用 7 楼 u010424605 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 《Windows核心编程》 有人向庖丁求解牛技巧，庖丁建议他去把动物世界看一遍 他回来之后发现自己成了赵忠祥[/quote] 有人向冯诺依曼求解编程技巧，冯诺依曼建议他去研究图灵机 他回来之后发现自己成了比尔盖茨。

user: user-5
content: 楼主的实现思路有一个问题, 每个消费者都会在适当的时刻去遍历那个生产者-消费者对列. 其实没这个必要, 我的想法是做四个对列, 第一个对列实现对所有策略依据ModuleID进行分发, 分别向另外三个对列中放入对应ID的策略.每个对应的消费者实现各自的处理流程. 这样每个生产者-消费者的对列的实现就简单很多(只需要用条件数进行等待即可), 而且方便进行类的封装. 如果楼主是在Windows平台, 可以使用MS的提供的Concurrency runtime , 库里面提供了Aynchronous message blocks, 可以很方便实现消息的过滤, 我以前做过一个项目就是用这个整的, 很容易.

user: user-0
content: 引用 8 楼 my_live_123 的回复:把消费者代码的倒数2，3注释掉！这两句wait和signal我觉得是多余的。 这样如果策略池不为空，并且里面的策略不是这个线程所需要的，那么这个线程就会一直循环来查询。 添加这两句在单个线程是可以把这个线程阻塞住的，但如果有多个线程的话，会互相signal那么wait的效果就没有了。

user: user-3
content: 把消费者代码的倒数2，3注释掉！这两句wait和signal我觉得是多余的。

user: user-6
content: 加入策略的时候先做分类？每个消费者只关注其兴趣的类别

user: user-0
content: 这个是我实现生产者的代码 这个是我实现消费者的代码 问题是当生产者生产出例外的moduleId的策略时，消费者多线程相互发送条件信号，导致cpu利用率超标到100%之上 我想 每生产一个策略 消费线程依次来检查一下有没有自己需要的 如果没有则阻塞在那里 不知道如何实现