http://blog.csdn.net/alane1986/article/details/6887359
多線程訪問共享內存,為了實現同步,常采用加鎖的方式。
那么,如何采用不加鎖的方式來達到線程同步的目的呢?
思路:
保存兩塊共享內存,一塊用於讀操作,一塊用於寫操作。
初始時,兩塊共享內存內容一致。讀操作均是讀取第一塊共享內存的數據;寫操作均是寫第二塊共享內存。
在多個讀操作一個寫操作的情況下,讀操作均從第一塊共享內存讀取,寫操作修改第二塊共享內存的數據。直至寫操作完成,交換兩塊共享內存的下標,即第二塊共享內存用於接下來的讀操作,第一塊共享內存根據第二塊共享內存數據更新,用於接來下的寫操作。
參考:
http://godorz.info/2010/05/synchronous-memory-access-for-multithread/
多線程的程序有很多的優點,就不一一列舉了,這里主要記錄一些工作的片段,看看多線程在我的工作處於一個什么樣的角色。 在一個進程空間里,新增一個線程的原因可能有很多,其中一個原因可能是增強程序的異步執行能力,把比較耗時的部分放到新線程里面去執行, 這樣能減輕主線程的壓力,提高主線程的邏輯處理能力和提高主線程的響應能力。線程要想相互協作,就要能相互通信,更多的情況下,是通過共享臨界資源來協作的。這里主要介紹如何不加鎖就能實現多線程對共享內存的訪問。
假設有兩個線程共享同一塊內存, 生產者線程不斷的添加一些指令到共享區域,消費線程的責任是處理共享區域里的指令,通過加鎖是能夠簡單清晰的解決這個問題的。深入分析一下,就不難發現,不用加鎖也能解決這個問題。把指令放入共享區域,對於生產者線程來說,整個過程是個流水線,是順序執行的;從共享區域取出指令來解析,這個過程對於消費者線程來說也是順序執行的。 考慮到這個特性,共享區域可以使用一個先進先出(FIFO)的隊列來實現,生產線程把指令在隊列頭部加入,消費線程在隊列尾部取出消息,進行解析。 這里主要得考慮一個情況,生產線程還沒有把某個指令全部放入隊列,消費線程就要來取了, 可以考慮給每個指令附加一個狀態如: volatile bool state; 當生產者把消息加入隊列后,把state置為真,消費費發現某個指令的狀態為真時,就知道該指令是可處理的了, 這里的volatile 一定不能忘記,只有保證對state的賦值是原子操作才能避免潛在的內存錯誤。