2015-09-01 23 views
3

我有一組對象,每個對象都有兩個線程:任務線程處理數據並通知判定線程數據已準備好,然後等待判定線程做出決定是否繼續經營;決定線程等待數據的任務線程,然後使用數據並做出決定(通知任務線程該決定準備好獲取)。如何在另一個類中通知條件變量C++

Task.cpp: 

class Task{ 
    public: 
     void DoTask(){ 
      // process data 
      { 
       std::unique_lock<std::mutex> lck(mtx); 
       data_ready = true; 
       cv_data.notify_one(); 

       while(decision_ready == false) 
        cv_decision.wait(lck); 
       } 
       if (decision) 
        // continue task 
       else 
        // quit 
     } 

     void SetDecision(bool flag) { decision = flag; } 
     bool GetDataFlag() const { return data_ready; } 
     bool SetDecisionFlag(bool flag) { decision_ready = flag; } 

     std::mutex mtx; 
     std::condition_variable cv_data; 
     std::condition_variable cv_decision; 

    private: 
     bool decision; 
     bool data_ready; 
     bool decision_ready; 
}; 

main.cpp中:

void Decision (Task *task); 

int main(){ 
    Task mytask[10]; 
    std::thread do[10]; 
    std::thread decision[10]; 
    for(int i=0; i< 10; ++i) 
    { 
     do[i] = std::thread(&Task::doTask, &mytask[i]); 
     decision[i] = std::thread(Decision, &mytask[i]); 
     do[i].detach(); 
     decision[i].detach(); 
    } 
} 

void Decision(Task *task) 
{ 
    st::mutex mtx_decision; 

    std::unique_lock<std::mutex> lck(task->mtx); 
    while(task->GetDataFlag() == false) 
     task->cv_data.wait(lck); 

    std::lock_guard<std::mutex> lk(mtx_decision); 
    // check database and make decision 

    task->SetDecision(true); 
    task->SetDecisionFlag(true); 
    task->cv_decision.notify_one(); 
} 

這有什麼方法的問題?該程序只適用於單線程的情況。如果我實際打開兩個或更多線程,則會出現分段錯誤。我不知道如何在不同範圍之間傳遞條件變量。希望有人能告訴我正確的做法。謝謝。

+0

您的'main'函數運行結束,終止進程。 –

回答

0

我想你需要相同的互斥量和相同的條件變量來使它工作。現在每個類都獲得自己的互斥和條件變量以及每個決定。

+0

這正是我想要的。由於每個任務獨立工作,每個任務都需要自己的互斥鎖和condition_variable來同步任務操作和決策。 – Sissi

+0

我在這裏看不到任何東西。你檢查coredump嗎?或者你在gdb中執行二進制文件? Stacktrace非常有幫助。 – KIIV

0

當你的應用程序崩潰時,最可能的原因是因爲你分離你的線程並且比你的main()退出,在他們正在做的事情中殺死線程。我強烈建議不要使用分離的線程。

相關問題