[英]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();
};
您正在使用固定數量的線程來防止同時發生活動任務過多的情況,但是當第一級任務等待第二級任務時,該線程不再處於活動狀態 ,因此不應再將其計數朝向固定數量的運行線程。
從我的角度來看,您有兩種解決方法:
等待另一個任務時將線程標記為忙 ,並告訴線程池它可以臨時創建一個新線程來替換它。 (這類似於Windows線程池CallbackMayRunLong函數)。
使用任務完成回調在第二級任務完成后恢復第一級任務,而不是等待它們。 (類似於您將如何使用javascript中的任務 )。
盡管更復雜,但是第二個選項更加靈活,std :: bind為您提供了一些用於保留這些回調之間的狀態的選項
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.