我想避免创建 std::thread 的开销,因此我要实现一个线程池。我正在为一个设计决策而苦苦挣扎:
工作队列中的工作是否应该能够将工作添加到工作队列中?如果是,如何?
问题出现了,因为我想让我添加到工作队列中的工作尽可能小(但不能更小),以获得平衡的工作流。问题是,如果我允许工作项向工作队列添加更多工作,就我所见,这很容易导致死锁。这对我来说就像一个僵局。
我对这个困境的建议是:如果工作队列中有一个线程空闲,则只添加子工作(工作添加的工作)。
这是在避免死锁吗?有没有更好的办法?
int sub_foo()
{
return 10;
}
void foo()
{
std::future result = work_queue.add( sub_foo );
std::cout << result.get();
}
int chính()
{
std::vector<>> futures;
for( int i = 0; i < 10000; ++i)
futures.push_back( work_queue.add( foo ));
for( int i = 0; i < 10000; ++i)
{
futures.back().get();
futures.pop_back();
}
}
添加:考虑到这种情况,work_queue 中的所有线程都在执行 foo 函数。他们不能(据我所知)和他们的工作,因为他们正在等待 result.get(),但这仍然在 work_queue 中并且无法执行,在 work_queue 中的一个线程空闲之前。
这取决于实际设计,你没有详细透露。
通过将简单的消息队列(无锁或互斥锁)附加到每个线程,以及循环消息分发器,我看不到死锁。
Tôi là một lập trình viên xuất sắc, rất giỏi!