我正在實施一些簡單的生產者/消費者程序,有一些信號量和共享內存。爲了簡單起見,我們假設我的程序中只有一塊共享內存和一個信號量。什麼來鎖定和什麼不鎖定在多線程環境(信號量和共享內存)
起初,我雖然只是考慮了試圖寫入共享內存塊的代碼的關鍵部分。但是,由於共享內存塊由1024bytes組成,我不能同時讀取所有數據(這不是一個原子操作),所以當我讀它時,確實有可能生產者開始寫入,所以讀者將獲得一半的舊數據,一半新數據。由此,我只能認爲我還必須將共享內存讀取邏輯放在「信號量」塊中。
現在,我有很多的代碼看起來像這樣:
if (sharedMemory[0] == '0') { ... }
在這種情況下,我只是希望在內存中的單個字符。我想我不必擔心在這附近放置一個信號燈,對吧?
而且如果不是我有類似
if (sharedMemory[0] == '0' && sharedMemory[1] == '1') { ... }
從我的角度來看,我猜測,因爲這是2點的操作,我不得不認爲這是一個重要的部分,因此不必把一個什麼信號周圍。我對嗎?
謝謝!
所以,我沒有得到你的文章的結論是什麼?我應該鎖定一切嗎? – 2010-11-14 16:51:22
記錄爲原子的函數當然是原子的(假設它們不是越野車)。 – 2010-11-14 18:14:19