2017-02-14 17 views
1

我有一個使用ah線程池來處理其所有作業的驗證類。如何寫一個blockng waitUntil()方法到使用std :: atomics的池

現在,當用戶詢問時,我開始一個線程,通過從磁盤讀取來爲我的驗證類提供作業。我相信在某一點上閱讀會比處理快。所以我想編寫一個方法,如果有超過1000個作業正在處理,允許此線程等待。

我已經引入了一個原子,它在添加作業時增加,在完成時減少。

我嘗試添加一個方法一直不太好。而且我知道一定可以使用更好的東西。

void Validator::waitUntilAvailable() { 
    while (m_blocksInFlight > 1000) { // thats my atomic 
     usleep(50000); // seems to be unavailable on Windows. 
    } 
} 

會有人在這裏能幫助具有非輪詢方法來解決我的問題?

謝謝。

+0

聽起來像一個信號 –

+0

...一個簡單的實現在這裏完美的使用:https://gist.github.com/sguzman/9594227 –

+0

@RichardHodges看起來像從http副本:// stackoverflow.com/a/4793662/412080 –

回答

1

有一個條件,你想等待,但沒有等待機制。

這種機制是std::condition_variablestd::mutex。例如:

class Validator 
{ 
    std::mutex m_mutex; 
    std::condition_variable m_condition; 
    std::atomic<int> m_blocksInFlight{0}; 

    bool test() const { 
     return m_blocksInFlight.load(std::memory_order_relaxed) > 1000; 
    } 

    void addJob() { 
     ++m_blocksInFlight; 

     // Only lock the mutex when the test succeeds. 
     if(this->test()) { 
      std::unique_lock<decltype(m_mutex)> lock(m_mutex); 
      m_condition.notify_one(); 
     } 
    } 

    void waitUntilAvailable() { 
     std::unique_lock<decltype(m_mutex)> lock(m_mutex); 
     while(!this->test()) 
      m_condition.wait(lock); 
    } 
}; 
+0

我已閱讀有關條件,但尚未完全理解它將如何應用。 如何減少m_blocksInFlight原子的代碼?我假設它也需要對互斥量做些什麼? – Tom

+0

@Tom爲您更新了代碼。 –

相關問題