【发布时间】:2010-11-29 17:36:52
【问题描述】:
我有一个完全线程安全的 FIFO 结构 (TaskList) 来存储任务类、多个线程,其中一些创建和存储任务,其他处理任务。 TaskList 类有一个 pop_front() 方法,如果至少有一个任务,则返回第一个任务。否则返回NULL。
下面是一个处理函数的例子:
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 进行线程处理。因为有时我必须终止处理时间过长的线程,并立即创建新线程。这对我来说至关重要。请不要建议这两个中的任何一个。
谢谢
【问题讨论】:
-
谷歌“C++ 阻塞队列”。来自 SO 的大量热门歌曲。
-
终止线程会产生未定义的行为。如果您必须终止某些东西,请创建进程并终止它们。
-
@Dialecitus:我认为一个进程是一个单独的应用程序,它是用命令行创建的。你有什么适合我的例子吗?
标签: c++ multithreading winapi synchronization