gpt4 book ai didi

C++ 线程池 : should work be able to add more work to the work-queue

转载 作者:行者123 更新时间:2023-11-28 06:07:08 29 4
gpt4 key购买 nike

我想避免创建 std::thread 的开销,因此我要实现一个线程池。我正在为一个设计决策而苦苦挣扎:

工作队列中的工作是否应该能够将工作添加到工作队列中?如果是,如何?

问题出现了,因为我想让我添加到工作队列中的工作尽可能小(但不能更小),以获得平衡的工作流。问题是,如果我允许工作项向工作队列添加更多工作,就我所见,这很容易导致死锁。这对我来说就像一个僵局。

我对这个困境的建议是:如果工作队列中有一个线程空闲,则只添加子工作(工作添加的工作)。

这是在避免死锁吗?有没有更好的办法?

int sub_foo()
{
return 10;
}

void foo()
{
std::future<int> result = work_queue.add( sub_foo );
std::cout << result.get();
}


int main()
{
std::vector<std::future<void>> 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 中的一个线程空闲之前。

最佳答案

这取决于实际设计,你没有详细透露。

通过将简单的消息队列(无锁或互斥锁)附加到每个线程,以及循环消息分发器,我看不到死锁。

关于C++ 线程池 : should work be able to add more work to the work-queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32175198/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com