● Slim锁:
○ 可区分读写操作, 可上共享锁
○ 效率比临界区高
● Slim的劣势:
○ 一旦上了独占锁, 共享锁的线程会被阻塞
● 线程状态
○ 线程的挂起, 休眠, 阻塞, 等待状态都会使线程不可调度
○ 当收到操作系统发送的通知说线程可以恢复运行的时候, 线程就又变成了可调度状态
1 #define UNICODE 2 #include <stdio.h> 3 #include <process.h> 4 #include <windows.h> 5 6 volatile int gNum; 7 //写 -> 导致线程不安全 8 // 多线程 -> 会出现安全问题 9 //读 10 // 多条县城 不停的读 -> 不会出现线程安全的问题的 11 // 多条线程读 1条线程在修改 -> 会出现安全问题的 12 volatile int gLoopCount = 100; 13 CRITICAL_SECTION gCs; //临界区 -> 关键段 14 SRWLOCK gSRW; //Silm锁 15 unsigned __stdcall ThreadFunc(void* lParam) 16 { 17 static int nThreadIndex = 0; //静态变量 18 nThreadIndex++; 19 EnterCriticalSection(&gCs); //进去临界区 20 AcquireSRWLockExclusive(&gSRW); //独占方式 21 // 22 //休眠 挂起 阻塞 等待 23 // 不可调度 -> 释放CPU 24 25 //递归 26 AcquireSRWLockShared(&gSRW); //共享方式打开 27 gNum = 0; 28 for(int i = 0; i < gLoopCount; ++i) 29 { 30 gNum += i; 31 } 32 printf("Thread%d:%d\r\n",nThreadIndex,gNum); 33 //LeaveCriticalSection(&gCs); 34 ReleaseSRWLockExclusive(&gSRW); 35 ReleaseSRWLockShared(&gSRW); 36 return 0; 37 } 38 39 int main() 40 { 41 const int MAXTHREADCOUNT = 10; 42 HANDLE hThreads[MAXTHREADCOUNT] = { INVALID_HANDLE_VALUE }; 43 //InitializeCriticalSection(&gCs); //分配一些内存 44 InitializeSRWLock(&gSRW); 45 InitializeCriticalSectionAndSpinCount(&gCs,1); //以旋转锁的方式使用临界区 46 for(int i = 0; i<MAXTHREADCOUNT; ++i) 47 { 48 hThreads[i] = (HANDLE)_beginthreadex(nullptr,0,ThreadFunc,nullptr,0,nullptr); 49 } 50 WaitForMultipleObjects(MAXTHREADCOUNT, hThreads, TRUE, INFINITE); 51 for( int i = 0; i<MAXTHREADCOUNT; ++i) 52 { 53 CloseHandle(hThreads[i]); 54 } 55 56 //DeleteCriticalSection(&gCs); 57 return 0; 58 }