多线程-互斥锁

#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);
//
//
//
//注意一个线程仅能锁定资源一次,不能多次锁定资源。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值