互斥锁

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");
}
原文地址:https://www.cnblogs.com/sjxbg/p/5790077.html