線程同步 旋轉鎖 Interlocked 用戶模式同步對象 InterlockedExchange

0、思考

如果需要以原子方式修改一個值。

1、相關api

InterlockedIncrement(相當於++)
InterlockedDecrement(相當於--)
InterlockedExchangeAdd(相當於+)
InterlockedExchangeAdd64
InterlockedExchange(相當於=)
InterlockedExchange64
InterlockedExchangePointer
InterlockedCompareExchange(相當於?:)
InterlockedCompareExchangePointer
InterlockedAnd(相當於&)
InterlockedOr(相當於|)
InterlockedXor(相當於~)**
InitializeSListHead(初始化單鏈表)
InterlockedFlushSList(清空單鏈表)
InterlockedPushEntrySList(插入)
InterlockedPopEntrySList(移除)
QueryDepthSList(查詢)

2、寫在前面

原子訪問:一個線程在訪問某個資源的同時能夠確保沒有其他線程會在同一時刻訪問同一資源。
volatile:告訴編譯器這個變量可能會被應用程序之外的其他東西修改;告訴編譯器不要對這個變量進行任何形式的優化,而是始終從變量在內存中的位置讀取。

所有使用旋轉鎖的線程都以相同的優先級運行。(爲什麼)
確保鎖變量和鎖所保護的數據位於不同高速緩存行。(爲什麼)
在單cpu的機器上應該避免使用旋轉鎖。(爲什麼)

如果優先級不同,優先級低的線程將無法獲得旋轉鎖。
如果同高速緩存行,那麼使用資源的cpu就會與任何試圖訪問資源的cpu發生爭奪而影響性能。
如果一個線程不停循環,也會阻止其他線程改變鎖的值。

3、api說明

WINBASEAPI
LONG
WINAPI
InterlockedIncrement (
    __inout LONG volatile *lpAddend
);

WINBASEAPI
LONG
WINAPI
InterlockedDecrement (
    __inout LONG volatile *lpAddend
);

WINBASEAPI
LONG
WINAPI
InterlockedExchange (
    __inout LONG volatile *Target,
    __in    LONG Value
);

WINBASEAPI
LONG
WINAPI
InterlockedExchangeAdd (
    __inout LONG volatile *Addend,
    __in    LONG Value
);

WINBASEAPI
LONG
WINAPI
InterlockedCompareExchange (
    __inout LONG volatile *Destination,
    __in    LONG Exchange,
    __in    LONG Comperand
);
WINBASEAPI
LONGLONG
WINAPI
InterlockedCompareExchange64 (
    __inout LONGLONG volatile *Destination,
    __in    LONGLONG Exchange,
    __in    LONGLONG Comperand
);

4、C++封裝

5、順藤摸瓜

鳴謝

覺的我寫的幫幫噠, 發個紅包賞賞賞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章