• 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 文件随机读写
    fread(),fwrite()函数
    C 将文本文件内容逆序打印
    C++ 文件复制
    关机效果
    xpath的语法
    ajax json 数据
    转帖 ASP.NET中高级程序员 面试题
    数据库查询的执行顺序
    【转载】母版页引用外部文件的路径问题
  • 原文地址:https://www.cnblogs.com/sdk123/p/7112360.html
Copyright © 2020-2023  润新知