我有一个完全线程安全的FIFO结构(TaskList
)来存储任务类,多线程数,其中一些创建和存储任务和其他处理的任务。 TaskList
类有一个pop_front()
方法,如果至少有一个返回第一个任务。否则它返回NULL
。
这里是处理功能的一个例子:等待的Win32线程
TaskList tlist;
unsigned _stdcall ThreadFunction(void * qwe)
{
Task * task;
while(!WorkIsOver) // a global bool to end all threads.
{
while(task = tlist.pop_front())
{
// process Task
}
}
return 0;
}
我的问题是,有时,存在在任务列表中没有新的任务,所以处理线程以无限循环(while(!WorkIsOver)
)和CPU负荷增大进入。不知怎的,我不得不让线程等待,直到一个新的任务存储在列表中。我考虑暂停和恢复,但是随后我需要额外的信息来说明哪些线程处于挂起或正在运行状态,从而给编码带来更大的复杂性。
任何想法?
PS。我正在使用winapi,而不是用于线程的Boost或TBB。因为有时我必须终止处理时间过长的线程,并立即创建新线程。这对我很重要。请不要建议这两个中的任何一个。
感谢
Google“C++阻塞队列”。很多来自SO的点击。 – 2010-11-23 16:31:52
终止线程会产生未定义的行为。如果你必须终止某些事情,那么创建进程并终止它们。 – Dialecticus 2010-11-23 17:07:15
@Dialecitus:我认为一个进程是一个独立的应用程序,它是用命令行创建的。你有没有适合我的案例的例子? – 2010-11-23 23:25:47