【发布时间】:2011-04-15 14:55:31
【问题描述】:
我正在做一些关于 C++ 多线程的实验,但我不知道如何解决一个问题。假设我们有线程池,它使用现有线程处理用户请求并在没有可用线程时创建新线程。我创建了 command_queue 线程安全类,它具有 push 和 pop 方法。 pop 在队列为空时等待,仅在命令可用或发生超时时返回。现在是时候实现线程池了。这个想法是让空闲线程休眠一段时间,如果在那段时间之后无事可做,则终止线程。这是实现
command_queue::handler_t handler;
while (handler = tasks.pop(timeout))
{
handler();
}
如果发生超时,我们在这里退出线程过程。这很好,但是新线程的创建存在问题。假设我们已经有 2 个线程处理用户请求,它们目前正在工作,但我们需要异步执行一些其他操作。 我们叫
thread_pool::start(some_operation);
应该启动新线程,因为没有可用的空闲线程。当线程可用时,它会在条件变量上调用timed_wait,因此我们的想法是检查是否有线程在等待。
if (thread_are_free_threads) // ???
condition.notify_one();
else
create_thread(thread_proc);
但是如何检查呢?文档说,如果没有等待线程 notify_one 什么也不做。如果我可以检查它是否什么都没做,那将是一个解决方案
if (!condition.notify_one()) // nobody was notified
create_thread(thread_proc);
据我所知,没有办法检查。
感谢您的回答。
【问题讨论】:
-
你知道用小cmets写代码通常比用少量代码的英文要清晰得多。将完整代码一次性发布。
标签: c++ boost threadpool