windows多线程同步机制---原子锁
生活随笔
收集整理的這篇文章主要介紹了
windows多线程同步机制---原子锁
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?原子鎖
執(zhí)行單個指令時,鎖定操作,不允許其他線程訪問.(循環(huán)執(zhí)行原子鎖運算時,循環(huán)過程中也是不允許其他線程訪問,直到循環(huán)執(zhí)行完原子操作)? ??
? 原理介紹:
線程執(zhí)行加減法時,依靠寄存器來計算,切換線程之前,先保存寄存器的值到線程中,再次輪到該線程執(zhí)行時,把值恢復(fù)到寄存器中繼續(xù)來計算。
? 問題描述:
想通過多線程執(zhí)行g(shù)_nValue++的操作(即累加一個值),線程A通過寄存器完成加法運算,假設(shè)g_nValue正在加到10000時,線程切換到B,A的寄存器中保存10000數(shù)字,B從10000開始加數(shù)據(jù),當(dāng)B加到15000時,線程切換到A,A恢復(fù)寄存器的值,A會繼續(xù)從10000開始累加,就將B完成5000的加法覆蓋.
? ??? 原子鎖解決:
原子鎖可以保證,在當(dāng)前線程循環(huán)執(zhí)行原子加/減操作時,其他線程不可以切換,直到當(dāng)前線程原子操作循環(huán)執(zhí)行完畢。
? 原子運算包括:
? ? InterlockedIncrement ++運算? ? InterlockedDecrement --運算
?? ?InterlockedCompareExchange ?運算
// InterLock.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include "windows.h"LONG g_nValue1 = 0; LONG g_nValue2 = 0;DWORD WINAPI InterProc1( LPVOID pParam ) {for( int nIndex=0; nIndex<10000000; nIndex++ ){ //普通++g_nValue1++;}return 0; } DWORD WINAPI InterProc2( LPVOID pParam ) {for( int nIndex=0; nIndex<10000000; nIndex++ ){ //原子鎖++(lock)InterlockedIncrement( &g_nValue2 );}return 0; }void Create( ) {DWORD nThreadID = 0;HANDLE hThread[4] = { NULL };hThread[0] = CreateThread( NULL, 0,InterProc1, NULL, 0, &nThreadID );hThread[1] = CreateThread( NULL, 0,InterProc1, NULL, 0, &nThreadID );hThread[2] = CreateThread( NULL, 0,InterProc2, NULL, 0, &nThreadID );hThread[3] = CreateThread( NULL, 0,InterProc2, NULL, 0, &nThreadID );WaitForMultipleObjects( 4, hThread, TRUE, INFINITE );printf( "Value1=%d Value2=%d\n", g_nValue1, g_nValue2 ); }int main(int argc, char* argv[]) {Create( );return 0; }總結(jié)
以上是生活随笔為你收集整理的windows多线程同步机制---原子锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone6、iPhone6Plus分
- 下一篇: 看电影学英语最时尚法则:“加减乘除”