线程同步——用户模式下线程同步——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 限性,所以我们在利用线程同步时应先考虑用户模式下的线程同步
原文地址:https://www.cnblogs.com/yfyzy/p/3916173.html