我使用一個std :: condition_variable這樣:執行了等待一個std :: condition_variable在「等待回調」通知
void wait()
{
std::unique_lock<std::mutex> lock(m_stateCompletedMutex);
m_waitCondition.wait(lock, [this](){return (m_state == STATE_COMPLETED);});
}
我與此很高興,但現在我想在「等待期間」執行一些代碼(我不知道是否可以這樣說,但這是想法),例如更新GUI或增加等待計數器或其他任何東西。
說我們使用Qt,我已經試過這樣的事情:
void wait()
{
std::unique_lock<std::mutex> lock(m_stateCompletedMutex);
while (m_state != STATE_COMPLETED)
{
m_waitCondition.wait(lock);
// Use this an example, it could be any code, executed in the waiting thread
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
}
}
這裏的目標是保持GUI響應(至少對系統事件,沒有用戶輸入),而我們正在等待爲了完成工作線程。
我對這個代碼的兩個問題:
1 /這是不是好辦法做到這一點,還是有更好的方法來執行代碼「在等待」
2 /執行多久「等待代碼」(在我的例子中的qApp-> processEvents調用)?它依賴於系統嗎?還是取決於當前的CPU負載或其他?或者我應該使用m_waitCondition。 wait_for確保最低頻率呼叫?
關於第2點/,我已經測試過監視它(使用std :: chrono :: high_resolution_clock),延遲似乎在我的應用程序中的200ms到4000ms之間,我認爲這是一個很大的範圍。
對於等待時執行代碼,您需要創建新的線程或進程。設計可以有10個線程,其中9個在給定時刻等待。通常'.wait()'只在對應的'.notify'調用之後纔會返回。 *虛假喚醒*實際上很少見。 – Tsyvarev
「虛假喚醒實際上很少見」:我也在想。但是我已經用一個經過時間計數器測試了一個輸出到控制檯(而不是我的例子中的qApp-> processEvents調用),並且消息每隔200ms到4000ms寫入控制檯。 – Aurelien
也就是說,你的'.wait()'喚醒**只有虛假的**(沒有在其他線程中調用'.notify()')每200-4000毫秒? – Tsyvarev