gpt4 book ai didi

c++ - 相互依赖任务的线程池

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

我有一个问题,在非递归情况下,线程池可以很好地解决这个问题,如果能够向池中添加更多任务,任务(分配给池的工作/功能)会大大受益。我的线程池实现的问题是第一级任务填满所有工作线程,创建第二级任务,然后在等待第二级任务完成时阻塞。由于所有工作线程都被阻塞等待第二级完成,第二级任务永远不会执行,因此整个程序死锁。

有什么通用的解决方案吗?可能是抢占式线程池(如果可能的话)。我确实考虑过明确确定任务的优先级,但问题是它不会自动处理依赖关系;它需要对 API 用户做更多的工作。

提前感谢您的任何见解或建议。

编辑:线程池类定义

class{
public:
thread_pool() = delete;
thread_pool(const thread_pool&) = delete;
thread_pool(unsigned int threads);
~thread_pool();

template<class T, class... Args>
std::future<T>
async(std::function<T(Args...)>&& f, Args&&... args);

template<class... Args>
std::future<void>
async(std::function<void(Args...)>&& f, Args&&... args);

template<class T>
std::future<T>
async(std::function<T()>&& f);

std::future<void>
async(std::function<void()>&& f);

protected:
void init_threads();
void join_threads();
};

最佳答案

您正在使用固定数量的线程来防止同时有太多事件任务的情况,但是当一级任务等待二级任务时,该线程是不再事件,因此它不应再计入固定的运行线程数。

在我看来,您有两种解决方法:

  1. 在等待另一个任务时将线程标记为繁忙,并告诉线程池它可以临时创建一个新线程来替换它。 (这类似于 Windows 线程池 CallbackMayRunLong 函数)。

  2. 使用任务完成回调在二级任务完成后恢复一级任务,而不是等待它们。 (类似于您在 javascript 中使用 tasks 的方式)。

虽然更复杂,但第二个选项更灵活,std::bind 为您提供了一些用于在这些回调之间保留状态的选项

关于c++ - 相互依赖任务的线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19408363/

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