首页 > 代码库 > 线程同步——用户模式下线程同步——Interlocked实现线程同步
线程同步——用户模式下线程同步——Interlocked实现线程同步
1 线程同步分为用户模式下的线程同步和内核对象的线程同步。 2 3 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 4 5 6 7 8 //1.利用原子访问: Interlocked系列函数,关于Interlocked系列函数,我需要知道的是他们,执行的极快 9 10 //(1)首先是InterlockedExchangeAdd兄弟函数, 11 //第一个参数 Addend 代表进行操作数的地址, 12 //第二个参数 Value 代表增加的值,如果是想进行减法,传负数即可 13 14 LONG InterlockedExchangeAdd( 15 LONG volatile *Addend, 16 LONG Value ) ; 17 18 LONG InterlockedExchangeAdd64( 19 LONG64 volatile *Addend, 20 LONG64 Value ); 21 //(2)还有其它3个Interlocked函数 22 23 LONG InterlockedExchange( 24 LONG volatile *Target, 25 LONG Value ) ; 26 27 LONGLONG InterlockedExchange64( 28 LONG64 volatile *Target, 29 LONG64 Value ); 30 31 PVOID InterlockedExchangePointer( 32 PVOID volatile *Target, 33 PVOID Value ); 34 35 //InterlockedExchange 和 InterlockedExchangePointer 36 //会把第一个参数所指向的内存地址的当前值,以原子方式替换为第二个参数指定的值 37 38 //(3)最后的另个Interlocked交换函数 39 PLONG InterlockedCompareExchange( 40 LONG volatile *Destination, 41 LONG Exchange, 42 LONG Comperand ) ; 43 44 PLONG InterlockedCompareExchangePointer( 45 PVOID volatile *Destination, 46 PVOID Exchange, 47 PVOID Comperand ) ; 48 //函数执行的伪代码 49 { 50 if (Destination == Comperand ) 51 { 52 Destination = Exchange ; 53 } 54 } 55 //函数会将当前值Destination与参数Comparand进行比较,如果两个值相同, 56 //那么函数会将*Destination 修改为Exchange,否则Destination保值不变 57 58 //实现旋转锁时,InterlockedExchange及其有用 59 //下面演示一下旋转锁 60 BOOL g_fResourceInUse = FALSE ; 61 void Func1() 62 { 63 //等待接收资源 64 while(InterlockedExchange(&g_fResourceInUse,TRUE) == TRUE ) 65 Sleep(0); 66 67 //接收资源 68 69 //我们不在需要接收资源 70 InterlockedExchange(&g_fResourceInUse,FALSE) ; 71 } 72 73 74 75 #include "windows.h" 76 #include "iostream" 77 using namespace std; 78 long g_x = 0 ; 79 80 //定义线程函数1 81 DWORD WINAPI ThreadFunOne(PVOID pvParam) ; 82 83 //定义线程函数2 84 DWORD WINAPI ThreadFunTwo(PVOID pvParam); 85 86 int main() 87 { 88 //创建线程1 89 HANDLE hThreadOne = CreateThread(NULL,0,ThreadFunOne,0,0,NULL); 90 CloseHandle(hThreadOne); 91 92 //创建线程2 93 HANDLE hThreadTwo = CreateThread(NULL,0,ThreadFunTwo,0,0,NULL); 94 CloseHandle(hThreadTwo); 95 96 //让主线程先挂起,确保其它线程执行完成 97 Sleep(10000); 98 cout<<g_x<<endl; 99 return 0 ;100 }101 102 DWORD WINAPI ThreadFunOne(PVOID pvParam) 103 {104 InterlockedExchangeAdd(&g_x,1) ;105 return 0;106 }107 108 DWORD WINAPI ThreadFunTwo(PVOID pvParam)109 {110 InterlockedExchangeAdd(&g_x,1) ;111 return 0;112 }113 114 115 限性,所以我们在利用线程同步时应先考虑用户模式下的线程同步
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。