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");
    }
  • 相关阅读:
    [转]addEventListener() 方法,事件监听
    JavaScrpit判断横竖屏
    无法获得锁 /var/lib/dpkg/lock
    配置Meld为git的默认比较工具
    C#多线程之旅(7)——终止线程
    【SQL进阶】03.执行计划之旅1
    单问号和双问号
    聚集索引VS非聚集索引
    【T-SQL进阶】02.理解SQL查询的底层原理
    【T-SQL】系列文章全文目录(2017-06-26更新)
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5790077.html
Copyright © 2011-2022 走看看