InterlockedIncrement和InterlockedDecrement的妙用

    一般來說,在多用戶線程環境中,我們使用臨界區、事件對象甚至互斥量來進行同步,尤其是臨界區,可以很方便地對某些變量甚至代碼塊進行鎖定執行,防止多線程之間資源惡性搶奪。既然如此,爲啥微軟又單獨提供了專用於一個數值鎖定計算的API函數InterlockedIncrement和InterlockedDecrement呢?他們又有什麼特殊作用呢?
    恰好近段時間寫了一個這方面的應用,幫我加深了對這類API函數的理解。
    首先描述一下需求,在應用中,有這樣一個類,它可能只被實例化一次,也可能會被實例化多次,但不管被實例化了幾次,它必須在構造函數裏執行一項初始化計算,假設初始化計算的函數爲WSAStartup,同時還需要在析構函數裏執行一下注銷計算,假設註銷計算的函數爲WSACleanup,現在有一個要求,就是它們的初始化和註銷計算只能被執行一次,就如同在一個項目中,只能運行一次WSAStartup和WSACleanup一樣。當然,大家可能會想到直接在工程的開始和結尾處實現這樣的功能,但是,如果把這個類的文件包括在其它測試工程裏進行測試,同時不改變其它工程的代碼,又該如何實現呢?
    其實,我們可以充分利用InterlockedIncrement和InterlockedDecrement,就如同COM的CoInitialize()和CoUninitialize()一樣,描述代碼如下:

    假設類名爲A:

    這樣,無論我們創建了類A的多少個實例,在類的構造函數和析構函數裏,WSAStartup和WSACleanup均只被執行一次,有效地保證了單元代碼的封裝性。

發佈了91 篇原創文章 · 獲贊 16 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章