一般在任务处理线程池中会有一个公共任务队列m_event_list,
任务监视线程有任务添加到m_event_list时,可以通过semaphore.post()增加信号量数来唤醒在semaphore信号量上的睡眠任务处理线程
简要代码为:
void add_event(Event &e)
{
m_event_list.push_back(e);
m_semaphore.post(); //唤醒在信号量队列上处于阻塞状态的任务处理线程来处理event
}
在每个任务线程的线程执行体threadProc()中,通过semaphore.pend()消费信号量来接收任务并处理任务,如果任务队列中没有任务要处理,则当前线程会被阻塞
简要代码为:
void threadProc()
{
while(looping())
{
if (m_event_list.empty() != false)
{
m_semaphore.pend();
Event e = m_event_list.front();
m_event_list.pop_front();
handle_event(e);
}//if
//do other thing
}//while
}
注:此处未做锁同步处理,在实际的使用过程当中一定要对m_event_list进行加锁同步。
注:还有一点,在实际项目中,主线程和子线程们之间用信号量进行同步,而用关键段来处理子线程们之间的互斥!