线程互斥锁跟条件变量实现特殊的生产者和消费者,要求消费者节省cpu
线程互斥锁和条件变量实现特殊的生产者和消费者,要求消费者节省cpu
现在有一个策略池(可认为是一个结构体链表),在生产者端生产出策略(可认为是一个结构体)放入策略池,并发送一个条件信号。在消费者端,有多个线程来消费这个策略池,但是每个线程的消费方式略有不同,
假设策略结构为
那么每个消费者线程只负责取出指定的moduleId的策略,并把该策略从策略池删除。
当策略池为空或者策略池没有该线程需要的策略时该线程要等待,以节省cpu。
注:策略池中可能存在所有线程指定的moduleId之外的策略。即假设策略池有moduleId为1、 2、3的策略,而只有两个线程来分别取moduleId为1和2的策略。
如果在消费者端采用轮询的话会大量消耗cpu,项目中是不允许的
------解决思路----------------------
加入策略的时候先做分类?每个消费者只关注其兴趣的类别
------解决思路----------------------
《Windows核心编程》
------解决思路----------------------
楼主的实现思路有一个问题, 每个消费者都会在适当的时刻去遍历那个生产者-消费者对列. 其实没这个必要, 我的想法是做四个对列, 第一个对列实现对所有策略依据ModuleID进行分发, 分别向另外三个对列中放入对应ID的策略.每个对应的消费者实现各自的处理流程. 这样每个生产者-消费者的对列的实现就简单很多(只需要用条件数进行等待即可), 而且方便进行类的封装.
如果楼主是在Windows平台, 可以使用MS的提供的Concurrency runtime , 库里面提供了Aynchronous message blocks, 可以很方便实现消息的过滤, 我以前做过一个项目就是用这个整的, 很容易.
------解决思路----------------------
现在有一个策略池(可认为是一个结构体链表),在生产者端生产出策略(可认为是一个结构体)放入策略池,并发送一个条件信号。在消费者端,有多个线程来消费这个策略池,但是每个线程的消费方式略有不同,
假设策略结构为
struct policy
{
int moduleId;
char *description;
};
那么每个消费者线程只负责取出指定的moduleId的策略,并把该策略从策略池删除。
当策略池为空或者策略池没有该线程需要的策略时该线程要等待,以节省cpu。
注:策略池中可能存在所有线程指定的moduleId之外的策略。即假设策略池有moduleId为1、 2、3的策略,而只有两个线程来分别取moduleId为1和2的策略。
如果在消费者端采用轮询的话会大量消耗cpu,项目中是不允许的
------解决思路----------------------
加入策略的时候先做分类?每个消费者只关注其兴趣的类别
------解决思路----------------------
《Windows核心编程》
------解决思路----------------------
楼主的实现思路有一个问题, 每个消费者都会在适当的时刻去遍历那个生产者-消费者对列. 其实没这个必要, 我的想法是做四个对列, 第一个对列实现对所有策略依据ModuleID进行分发, 分别向另外三个对列中放入对应ID的策略.每个对应的消费者实现各自的处理流程. 这样每个生产者-消费者的对列的实现就简单很多(只需要用条件数进行等待即可), 而且方便进行类的封装.
如果楼主是在Windows平台, 可以使用MS的提供的Concurrency runtime , 库里面提供了Aynchronous message blocks, 可以很方便实现消息的过滤, 我以前做过一个项目就是用这个整的, 很容易.
------解决思路----------------------
//将这些不同的策略分开,用不同的队列,否则就是用链表了,不是先进先出的方式
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;
}
}
}
}