我有一組對象,每個對象都有兩個線程:任務線程處理數據並通知判定線程數據已準備好,然後等待判定線程做出決定是否繼續經營;決定線程等待數據的任務線程,然後使用數據並做出決定(通知任務線程該決定準備好獲取)。如何在另一個類中通知條件變量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();
}
這有什麼方法的問題?該程序只適用於單線程的情況。如果我實際打開兩個或更多線程,則會出現分段錯誤。我不知道如何在不同範圍之間傳遞條件變量。希望有人能告訴我正確的做法。謝謝。
您的'main'函數運行結束,終止進程。 –