zoukankan      html  css  js  c++  java
  • 互斥锁

    1.互斥锁写入或者读取的时候都可以锁定。

    2.互斥锁中的函数

    •  InitializeSRWLock
      函数功能:初始化读写锁
      函数原型:VOID InitializeSRWLock(PSRWLOCK SRWLock);
      函数说明:初始化(没有删除或销毁SRWLOCK的函数,系统会自动清理)
    •  AcquireSRWLockExclusive
      函数功能:写入者线程申请写资源。
      函数原型:VOID AcquireSRWLockExclusive(PSRWLOCK SRWLock);
    • 第三个 ReleaseSRWLockExclusive
      函数功能:写入者线程写资源完毕,释放对资源的占用。
      函数原型:VOID ReleaseSRWLockExclusive(PSRWLOCK SRWLock);
    • 第四个 AcquireSRWLockShared
      函数功能:读取者线程申请读资源。
      函数原型:VOID AcquireSRWLockShared(PSRWLOCK SRWLock);
    • 第五个 ReleaseSRWLockShared
      函数功能:读取者线程结束读取资源,释放对资源的占用。
      函数原型:VOID ReleaseSRWLockShared(PSRWLOCK SRWLock);

    注意一个线程仅能锁定资源一次,不能多次锁定资源。

    3.例子

    例一:

    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>
    
    int num = 6400000;
    SRWLOCK g_lock; //创建一个互斥锁的全局变量
    // 注意一个线程仅能锁定资源一次,不能多次锁定资源
    DWORD WINAPI read(void*p)
    {
        AcquireSRWLockShared(&g_lock);//读取期间,锁定数据,数据无法被修改
        int i = 0;
        while (1)
        {
            Sleep(1000);
            printf("
    第%d秒num=%d",i, num);
    
            if (i==20)
            {
                break;
            }
            i++;
        }
        ReleaseSRWLockShared(&g_lock);
    
    }
    
    DWORD WINAPI go(void *p)
    {
        AcquireSRWLockExclusive(&g_lock);//锁定写入,
        printf("
    开始写入");
        for (int i = 0; i < 100000; i++)
        {
            num--;
            //Sleep(10);
        }
        ReleaseSRWLockExclusive(&g_lock);//
        printf("
    结束写入");
    
    }
    
    
    void main()
    {
        InitializeSRWLock(&g_lock);//初始化
    
    
        CreateThread(NULL, 0, read, NULL, 0, NULL);
    
    
        HANDLE hd[64];
        for (int i = 0; i < 64; i++)
        {
            hd[i] = CreateThread(NULL, 0, go, NULL, 0, NULL);
        }
    
        WaitForMultipleObjects(64, hd, TRUE, INFINITE);
    
        printf("
     last=%d", num);
    
    
        system("pause");
    }

    例二 :

    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>
    
    int num = 6400000;
    SRWLOCK g_lock;
    
    //改变一个变量的时候需要锁定
    
    DWORD WINAPI go(void *p)
    {
        AcquireSRWLockExclusive(&g_lock);//锁定写入
        for (int i = 0; i < 100000;i++)
        {
            num--;
        }
        ReleaseSRWLockExclusive(&g_lock);//
    
    
    }
    
    void main1()
    {
        InitializeSRWLock(&g_lock);//初始化
        HANDLE hd[64];
        for (int i = 0; i < 64;i++)
        {
            hd[i] = CreateThread(NULL, 0, go, NULL, 0, NULL);
        }
        WaitForMultipleObjects(64, hd, TRUE, INFINITE);
        printf("%d", num);
    
    
        system("pause");
    }
  • 相关阅读:
    鼠标放大镜案例代码
    鼠标点击跟随,鼠标点击哪里,图片跟随到哪里;
    筋斗云效果(云朵在导航栏内随着鼠标移动)
    HDU5003:Osu!(签到题)HDU5038:(签到题,题意很坑)
    SDUT3146:Integer division 2(整数划分区间dp)
    SDUT3145:Integer division 1(换零钱背包)
    SDUT3143:Combinatorial mathematics(组合数学)
    SDUT3141:Count(哈希)好题
    SDUT1574:组合数的计算
    SDUT1607:Number Sequence(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5790077.html
Copyright © 2011-2022 走看看