首页 > 代码库 > 线程同步——用户模式下线程同步——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 限性,所以我们在利用线程同步时应先考虑用户模式下的线程同步