我有一個高優先級進程,需要將數據傳遞給低優先級進程。我寫了一個基本的環形緩衝區來處理數據的傳遞:沒有優先級反轉的環形緩衝區
class RingBuffer {
public:
RingBuffer(int size);
~RingBuffer();
int count() {return (size + end - start) % size;}
void write(char *data, int bytes) {
// some work that uses only buffer and end
end = (end + bytes) % size;
}
void read(char *data, int bytes) {
// some work that uses only buffer and start
start = (start + bytes) % size;
}
private:
char *buffer;
const int size;
int start, end;
};
這是問題所在。假設低優先級進程有一個oracle,告訴它需要讀取多少數據,所以不需要調用count()
。然後(除非我錯過了什麼)沒有併發問題。但是,只要低優先級線程需要調用count()
(高優先級線程可能想要調用它以檢查緩衝區是否太滿),則count()中的數學或更新爲結束不是原子,引入了一個錯誤。
我可以在開始和結束的訪問周圍放置一個互斥量,但如果高優先級線程必須等待低優先級線程獲取的鎖定,則會導致優先級反轉。
我可能能夠使用原子操作工作,但我不知道有一個很好的跨平臺庫提供這些。
是否有避免這些問題的標準環形緩衝設計?
提供了跨平臺的原子功能是否有在平臺上的任何約束的使用? – 2011-04-21 16:39:20
@Peter讓我們假設x86(其中IIRC 32位寫入對齊的地址是原子的),儘管越便攜越好。 – user168715 2011-04-21 17:22:36
這裏是一個等待免費的隊列http://software.intel.com/zh-cn/articles/single-producer-single-consumer-queue/ – 2011-04-21 20:41:16