#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
//HANDLE mutex = NULL;
SRWLOCK g_lock;
//改变一个变量的时候需要锁定
int num = 6400000;
//在读期间,值一直在变化,没有锁定。
DWORD WINAPI reada(void *p)
{
int i = 0;
while (1)
{
Sleep(1000);
printf("第 %d 秒num=%d\n", i, num);
if (i == 20)
{
break;
}
i++;
}
}
//使用AcquireSRWLockShared()锁定读取的资源
DWORD WINAPI readb(void *p)
{
int i = 0;
AcquireSRWLockShared(&g_lock);
while (1)
{
Sleep(1000);
printf("第 %d 秒num=%d\n", i, num);
if (i == 20)
{
break;
}
i++;
}
ReleaseSRWLockShared(&g_lock);
}
//写
DWORD WINAPI sub(void *p)
{
//WaitForSingleObject(mutex, INFINITE);
AcquireSRWLockExclusive(&g_lock);//函数功能:锁定写入。
for (int i = 0; i < 100000; i++)
{
num--;
Sleep(1);
}
ReleaseSRWLockExclusive(&g_lock);//函数功能:写入者线程写资源完毕,释放对资源的占用
//Sleep(1000);
//ReleaseMutex(mutex);
return 0;
}
//读写
void main()
{
InitializeSRWLock(&g_lock); //初始化
CreateThread(NULL, 0, reada, NULL, 0, NULL); //读取时,值没被锁定,所以值一直在变化
//CreateThread(NULL, 0, readb, NULL, 0, NULL); //读取时,值被锁定
HANDLE hd[64] = { 0 };
for (int i = 0; i < 64; i++)
{
hd[i] = CreateThread(NULL, 0, sub, NULL, 0, NULL);
}
CreateThread(NULL, 0, readb, NULL, 0, NULL); //读取时,值被锁定
WaitForMultipleObjects(64, hd, TRUE, INFINITE);
printf("main.num=%d\n", num);
system("pause");
}
//只是写
void main1()
{
//创建互斥量
//mutex = CreateMutex(NULL, FALSE, NULL);
InitializeSRWLock(&g_lock); //初始化
HANDLE hd[64] = { 0 };
for (int i = 0; i < 64; i++)
{
hd[i] = CreateThread(NULL, 0, sub, NULL, 0, NULL);
//WaitForSingleObject(hd[i], INFINITE);
}
WaitForMultipleObjects(64, hd, TRUE, INFINITE);
printf("%d\n", num);
system("pause");
}
//第一个 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);
//
//
//
//注意一个线程仅能锁定资源一次,不能多次锁定资源。