簡體   English   中英

相互依賴任務的線程池

[英]Thread pool for interdependent tasks

我有一個問題,在非遞歸的情況下,線程池可以很好地解決這個問題,而任務(賦予池的工作/功能)可以向池中添加更多任務,將會大大受益。 我的線程池實現的問題是,第一級任務填充了所有工作線程,創建了第二級任務,然后在等待第二級任務完成時阻塞。 由於所有工作線程都被阻塞,等待第二級完成,因此第二級任務將永遠不會執行,因此整個程序將陷入僵局。

有什么通用的解決方案嗎? 可能是搶占式線程池(如果可能的話)。 我確實考慮過明確地確定任務的優先級,但是問題在於它不會自動處理依賴關系。 它需要在API用戶上進行更多工作。

預先感謝您的任何見解或建議。

編輯:線程池類def

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中的任務 )。

盡管更復雜,但是第二個選項更加靈活,std :: bind為您提供了一些用於保留這些回調之間的狀態的選項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM