Win32多線程同步方法

來源:互聯網
上載者:User

       因為最近要做多線程方面的工作, 用到多線程的內容, 而網上搜了不少都是一些沒什麼用, 零零散散的內容, 根本沒有系統和可學性. 看了<<Win32多線程程式設計>>對於在windows32平台上的多線程編程, 有很好的指導作用.
       下面先說一下線程同步的幾種方法:(如果看不懂下面術語的話,先看一些基本書籍, 最好看看MSDN)

        1. Interlocked系列函數: 是一系列原子操作. 如果只是對單個32位變數進行增減, 交換等簡單操作, 這個系列函數再合適不過了. 簡單,高效.
        2. Critical Section: 這是一個使用者模式下的局部同步變數, 不是核心對象, 可以鎖定單個操作, 速度比較快. 因其不是核心對象, 不能命名, 不能用在處理序間通訊. 不能使用wait系列函數進行等待(當然就不能等待多個了).
        3. Mutex: 互斥核心對象, 使用Create系列函數建立, 使用wait系列函數等待資源變數. 可以命名,可以用在處理序間通訊. 其鎖定操作花費是Critical Section 的100倍以上. 如果是線程內通訊,並且不用等待多個資源變數, 基本用不上mutex, 因為Critical Section足夠解決問題.
        4. Semephore: 訊號量核心對象, 使用Create系列函數建立, 使用wait系列函數等待資源. 是針對存在多份資源控制的有效方法. 具有核心對象的其他性質.
        5. Event: 事件核心對象, 具有其他核心對象的性質, 分手動重設事件和自動重設事件. 一般用來進行線程間通知: 比如, 子線程結束, 通知主線程; 主線程需要暫停子線程;等情況.
在Win32的C++層面, 就上面五種,沒其他了,同步就這幾種方法,看似簡單,其實大有學問. 接下來有時間一個一個展開分析.

        還有其他一些基本的概念與注意事項:
Interlocked系列函數是原子操作, 如InterlockedIncrement(i)使i增加1;  但 i++ 不是原子操作. 如果問為什麼? 因為i++在執行時需要分解成多個指令級操作, 可能會因為中斷產生而造成資料不同步. 具體情況就不討論了.
        主線程開啟了子線程, 一般情況下不等子線程結束是錯誤的做法. 除非用堆空間變數, 但這也不見得是一個好的方法, 還是老實等子線程結束, 或者限時等待放棄子線程.
        不要在子線程內調用 busy loop 和 wati...()函數. 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.