015 Slim锁及线程休眠及等待及挂起及阻塞

  ● 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 }

 

posted @ 2017-07-03 17:56  ☆﹎夜﹎☆  阅读(158)  评论(0编辑  收藏  举报