用户模式下的线程同步

// UserModeSync.cpp : // 演示用户模式下的线程同步,interlock系列函数和关键代码段 // 用户模式下的线程同步方式相对于内核对象同步 // 最大的优点是速度快,最大的缺点是无法在不同进程的线程之间实现同步 #include "stdafx.h" long g_x = 0; long g_nSum = 0; CRITICAL_SECTION g_cs; #define CRITICAL 1 //#define INTERLOCKED 2 DWORD WINAPI ThreadFun1(PVOID pvParam) { //g_x++; //未使用任何同步措施 InterlockedExchangeAdd(&g_x,1); //使用原子访问,确保InterlockedExchangeAdd执行时,其他线程无法访问g_x return(0); } DWORD WINAPI ThreadFun2(PVOID pvParam) { //g_x++; InterlockedExchangeAdd(&g_x,1); return(0); } DWORD WINAPI ThreadFun3(PVOID pvParam) { /* 关键代码段用于对若干行代码实现原子操作。 即保证关键代码段中的所有代码在执行过程中,CPU不会去执行其他线程,从而实现线程同步 关键代码段的缺点在于,无法在不同进程的线程之间实现同步 */ EnterCriticalSection(&g_cs); g_nSum=0; for(int n=1;n<100;n++) { g_nSum += n; } LeaveCriticalSection(&g_cs); return(0); } DWORD WINAPI ThreadFun4(PVOID pvParam) { EnterCriticalSection(&g_cs); g_nSum=0; for(int n=1;n<101;n++) { g_nSum += n; } LeaveCriticalSection(&g_cs); return(0); } int _tmain(int argc, _TCHAR* argv[]) { HANDLE someThread[2]; #ifdef INTERLOCKED while(1) { someThread[0]=CreateThread(0,0,ThreadFun1,0,0,0); someThread[1]=CreateThread(0,0,ThreadFun2,0,0,0); Sleep(10); printf("%d",g_x); if(g_x != 2) break; g_x = 0; } #endif #ifdef CRITICAL InitializeCriticalSectionAndSpinCount(&g_cs,100); //初始化关键代码段对象 someThread[0]=CreateThread(0,0,ThreadFun3,0,0,0); someThread[1]=CreateThread(0,0,ThreadFun4,0,0,0); Sleep(4000); //等待线程运行完毕 DeleteCriticalSection(&g_cs); //移除关键代码段对象 printf("%d",g_nSum); //打印结果 #endif return 0; }

你可能感兴趣的:(winapi)