1. 程式人生 > >多執行緒訪問共享記憶體的不加鎖實現方式

多執行緒訪問共享記憶體的不加鎖實現方式

http://blog.csdn.net/alane1986/article/details/6887359

多執行緒訪問共享記憶體,為了實現同步,常採用加鎖的方式。

那麼,如何採用不加鎖的方式來達到執行緒同步的目的呢?

思路:

儲存兩塊共享記憶體,一塊用於讀操作,一塊用於寫操作。

初始時,兩塊共享記憶體內容一致。讀操作均是讀取第一塊共享記憶體的資料;寫操作均是寫第二塊共享記憶體。

在多個讀操作一個寫操作的情況下,讀操作均從第一塊共享記憶體讀取,寫操作修改第二塊共享記憶體的資料。直至寫操作完成,交換兩塊共享記憶體的下標,即第二塊共享記憶體用於接下來的讀操作,第一塊共享記憶體根據第二塊共享記憶體資料更新,用於接來下的寫操作。

參考:

多執行緒的程式有很多的優點,就不一一列舉了,這裡主要記錄一些工作的片段,看看多執行緒在我的工作處於一個什麼樣的角色。 在一個程序空間裡,新增一個執行緒的原因可能有很多,其中一個原因可能是增強程式的非同步執行能力,把比較耗時的部分放到新執行緒裡面去執行, 這樣能減輕主執行緒的壓力,提高主執行緒的邏輯處理能力和提高主執行緒的響應能力。執行緒要想相互協作,就要能相互通訊,更多的情況下,是通過共享臨界資源來協作的。這裡主要介紹如何不加鎖就能實現多執行緒對共享記憶體的訪問。


    假設有兩個執行緒共享同一塊記憶體, 生產者執行緒不斷的新增一些指令到共享區域,消費執行緒的責任是處理共享區域裡的指令,通過加鎖是能夠簡單清晰的解決這個問題的。深入分析一下,就不難發現,不用加鎖也能解決這個問題。把指令放入共享區域,對於生產者執行緒來說,整個過程是個流水線,是順序執行的;從共享區域取出指令來解析,這個過程對於消費者執行緒來說也是順序執行的。 考慮到這個特性,共享區域可以使用一個先進先出(FIFO)的佇列來實現,生產執行緒把指令在佇列頭部加入,消費執行緒在佇列尾部取出訊息,進行解析。 這裡主要得考慮一個情況,生產執行緒還沒有把某個指令全部放入佇列,消費執行緒就要來取了, 可以考慮給每個指令附加一個狀態如: volatile bool state; 當生產者把訊息加入佇列後,把state置為真,消費費發現某個指令的狀態為真時,就知道該指令是可處理的了, 這裡的volatile 一定不能忘記,只有保證對state的賦值是原子操作才能避免潛在的記憶體錯誤。