我有一個無鎖定單生產者多個消費者隊列,使用std::atomics
以類似於香草服務器CPPCon2014的方式實現。condition_variable在無鎖實現中無互斥鎖
有時,生產者過於緩慢,無法供給所有消費者,因此消費者可能會捱餓。我想阻止飢餓的消費者在隊列中砰砰地跳,因此我爲10ms
添加了睡眠。這個值是任意的並且不是最優的。我希望使用一個信號,消費者可以在隊列中有空閒插槽後再發送給製作人。在基於鎖的實現中,我自然會使用std::condition_variable
來執行此任務。但是現在在我的無鎖實現中,我不確定,如果它是引入mutex
的正確設計選擇,那麼只能使用std::condition_variable
。
我只是想問你,如果在這種情況下mutex
是正確的路?
編輯:我有一個生產者,從來沒有睡覺。還有多個消費者,如果他們餓死,他們就會入睡。因此整個系統總是在進步,因此我認爲它是無鎖的。 我目前的解決辦法是要做到這一點,在消費者中的GetData功能:
std::unique_lock<std::mutex> lk(_idleMutex); _readSetAvailableCV.wait(lk);
這在生產者線程一旦新的數據已經準備好:
_readSetAvailableCV.notify_all();
帶有信號的睡眠線程不是鎖定的,非常符合定義。你知道鎖定免費主要是關於某些保證aboit線程調度和進度,而不是aboit「更快」,對嗎?你需要什麼鎖定免費保證? – Yakk
我不認爲我理解。如果是飢餓的消費者,爲什麼他們在隊列中有空閒插槽時通知製片人? – Davislor
但是,如果你確實需要一個帶有多個編寫器的變量,這意味着至少有一個編寫器準備好使用更新,那聽起來就像是一個原子標誌。 – Davislor