zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Struts2+Spring3+Mybatis3开发环境搭建
    spring+struts2+mybatis
    【LeetCode】Populating Next Right Pointers in Each Node
    【LeetCode】Remove Duplicates from Sorted Array
    【LeetCode】Remove Duplicates from Sorted Array II
    【LeetCode】Binary Tree Inorder Traversal
    【LeetCode】Merge Two Sorted Lists
    【LeetCode】Reverse Integer
    【LeetCode】Same Tree
    【LeetCode】Maximum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/sdk123/p/7112360.html
Copyright © 2011-2022 走看看