• 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
    ",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 }
  • 相关阅读:
    C#和Sql Server 2005中时间的最大值和最小值
    Windows Server 2008 R2 With SP1简体中文版 + 破解补丁
    Merge窗体的制作
    SqlServer2008R2卸载
    Highlighter(高亮控件的边框)
    如何删除window.old文件
    如何全屏WinForm的窗体
    验证时出错。HRESULT = '8000000A'
    ReflectionLabel(倒影控件)
    windows 2003和server 2008 取消对网站的安全检查/去除添加信任网站
  • 原文地址:https://www.cnblogs.com/sdk123/p/7112360.html
Copyright © 2020-2023  润新知