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

标签 c++ multithreading threadpool

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

有什么通用的解决方案吗?可能是抢占式线程池(如果可能的话)。我确实考虑过明确确定任务的优先级,但问题是它不会自动处理依赖关系;它需要对 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/

相关文章:

c++ - OpenSSL库是否自动使用openssl.cnf

c - 如何编写检查竞争条件的测试?

java - Thread.sleep 和 happens-before 有什么关系?

php如何从exe文件接收多个cout?

c++ - 为什么 sizeof 运算符对数组产生不同的结果

c++ - 用数据点填充矩阵

使用 ThreadPool 的 C# Execute 方法(带参数)

java - 多线程从文件读取并执行runnable

c++ - 如何在线程完成工作时触发事件

c# - 快速创建数千个线程并同时执行它们