我有一個RingBuffer哪些服務一個消費者和一個生產者和使用兩個整數檢測新的數據:單生產者,單消費者環緩衝區的最小限制內存排序?
_lastReadIndex
_lastWrittenIndex
所以在ringbuffer未讀數據時,這兩個值不相等。
生產者增量(並且模緩衝緩衝區大小以環繞)_lastWrittenIndex
當項目被添加到環緩衝區時。
消費者旋轉時,閱讀兩個值,檢查新數據,並在那裏,它會增量(和模量)_lastReadIndex
。
這三個突出的術語強調了關於多線程和內存障礙的要求。
我可以放寬這種設計的內存排序,佔據英特爾內存模型的多少?我相信英特爾的內存模型允許將更早的商店重新訂購到不同的地址。
編輯使用C++ 11原子庫std::memory_order_xxxx
等
那麼,你想要爲C++ 11原子,或依賴於架構的決定(使用匯編)爲英特爾?在第一種情況下架構不相關,第二種情況下「C++」標籤無關。 – Tsyvarev
對不起,C++ 11庫 – user997112
問題是你在環形緩衝區中的索引取決於讀取_lastReadIndex值和**模數。所以這是兩個單獨的行爲。如果僅僅是讀取'_lastReadIndex'中的值,那麼讀取''獲取'和寫入'釋放'就足夠了。 – ViNi89