日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

windows多线程同步机制---原子锁

發布時間:2023/12/20 windows 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows多线程同步机制---原子锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?原子鎖

執行單個指令時,鎖定操作,不允許其他線程訪問.(循環執行原子鎖運算時,循環過程中也是不允許其他線程訪問,直到循環執行完原子操作)
? ??

? 原理介紹:

線程執行加減法時,依靠寄存器來計算,切換線程之前,先保存寄存器的值到線程中,再次輪到該線程執行時,把值恢復到寄存器中繼續來計算。


? 問題描述:

想通過多線程執行g_nValue++的操作(即累加一個值),線程A通過寄存器完成加法運算,假設g_nValue正在加到10000時,線程切換到B,A的寄存器中保存10000數字,B從10000開始加數據,當B加到15000時,線程切換到A,A恢復寄存器的值,A會繼續從10000開始累加,就將B完成5000的加法覆蓋.

? ??

? 原子鎖解決:

原子鎖可以保證,在當前線程循環執行原子加/減操作時,其他線程不可以切換,直到當前線程原子操作循環執行完畢。


? 原子運算包括:

? ? 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; }

總結

以上是生活随笔為你收集整理的windows多线程同步机制---原子锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。