這是一個強大的數據消耗迴路中止選項:
while(true) {
decltype(dataContainer) data;
{
std::unique_lock<std::mutex> lock(mutex);
cond.wait(lock, []() { return stopThread || !dataContainer.empty(); });
if (stopThread)
return; //exit thread
data = std::move(dataContainer);
}
for (auto&& d:data) {
if (stopThread) return; // abort
//process data from d
}
}
stopThread
應atomic
或在底部需要有mutex
加以防護在for(:)
環路接。
在for(:)
循環中訪問stopThread
是可選的;沒有它,它將不會中止,直到它完成了它所拾取的一攬子工作。
dataContainer
是一組工作要做的std::vector
或某些形式的工作。線程醒來,抓住所有待完成的工作,然後開始工作。
你也可以從dataContainer
中彈出一個任務,而不是全部完成。由此產生的代碼更簡單。
要排隊的數據爲dataContainer
,你必須鎖定mutex
,把數據,然後通知:
{
std::unique_lock<std::mutex> lock(mutex);
dataContainer.push_back(new_data);
}
cond.notify_one();
關閉:
{
std::unique_lock<std::mutex> lock(mutex);
stopThread = true;
}
cond.notify_all();
請注意,即使stopThread
是原子,你需要獲取互斥鎖。另外還有一個競賽條件。
我知道你在使用lambdas,但是'[&] {...}'語法是什麼? –
通過引用抓住一切,沒有參數 –
我會做一個永久循環,等待,並打破自己。另外,你應該讓你的'newDataAvailable'具有相同的名字。 ;)接下來,您可能不希望在整個處理數據期間持有互斥鎖;這使得排隊等待新數據的人們必須等待舊數據的處理。 – Yakk