2013-10-16 143 views
0

我有一個問題,在非遞歸的情況下,線程池可以很好地處理它,並且可以從任務(給池的工作/函數)中獲益很多,從而可以向池中添加更多任務。我的線程池實現的問題在於,第一級任務填充所有工作線程,創建第二級任務,然後在等待第二級任務完成時阻塞。由於所有的工作線程都被阻塞,等待第二級完成,所以第二級任務永遠不會執行,因此整個程序都會死鎖。相關任務的線程池

這是否有任何通用的解決方案?可能是先發制人的線程池(如果甚至可能的話)。我確實認爲有明確的優先任務,但問題在於它不會自動處理依賴關係;它需要更多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(); 
}; 
+0

如何阻斷地圖?一個一級任務是否創建一個二級任務或更多? –

+0

請澄清:您已經創建了自己的線程池,而不是使用運行時環境或開發環境提供的線程池? –

+0

@Martin:每個第n級任務可以添加任意數量的n + 1級任務。 – Tyler

回答

1

您正在使用的線程固定數量,以防止過多的活躍任務的情況下,在同一時間,但是當第一級任務等待一個二級的,那個線程不再是活動的,所以它不應該再算上固定數量的正在運行的線程。

的方式,我看到它,你必須圍繞這一工作的方式有兩種:

  1. 馬克線程作爲等待另一個任務時,告訴線程池,它可以暫時創建一個新的線程忙取代它。 (這與Windows Thread Pool CallbackMayRunLong函數類似)。

  2. 使用任務完成回調在第二級完成後恢復第一級任務,而不是等待它們。 (類似於你如何在JavaScript中使用任務)。

雖然比較複雜,第二個選項是更加靈活和std ::綁定給你的回調之間保持狀態的幾個選項