Windows核心编程<读书笔记八>线程的同步

 

【文起】亲爱的蟹儿,想念你就是我坚持下去的动力。为了每天能一起喝红酒,奋斗,嘻嘻

用户方式中线程的同步

1、  当系统中的线程对同一共享资源进行读取时,就会涉及线程的同步,也就是线程间的相互通信。

2、  原子访问:互锁

为了保证同一时间内只有一个线程在访问共享资源,我们一般会建立互锁函数。如函数

LONG InterlockedExchangeAdd(PLONG plTarget,LONG lVaule);就会以原子访问形式给传入的地址的值加或减相应的值。

3、  函数 InterlockedExchange()

//共享资源是否在被访问
BOOL g_fResourceInUse = FALSE;

void Func1()
{
	//将变量值为TRUE,并看看之前值是什么,如果是TRUE,那么就等待,否则可以访问
	while (TRUE == InterlockedExchange(&g_fResourceInUse,TRUE))
	{
		Sleep(0);
	}

	/************************************************************************/
	/*可以对共享资源进行访问了                                              */
	/************************************************************************/

	//用完了将共享资源再置为FALSE
	InterlockedExchange(&g_fResourceInUse,FALSE);
}


4、关键代码:

是指这样一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权

所以我们可以通过如下结构体 CRITICAL_SECTION

举例如下:

const int MAX_TIMES = 1000;
int g_nIndex = 0;
DWORD g_dwTimes[MAX_TIMES];
CRITICAL_SECTION g_cs;

//初始化CRITICAL_SECTION,且循环等待不超过400次
InitializeCriticalSectionAndSpinCount(&g_cs,400);
DWORD WINAPI FirstThread(PVOID pvParam)
{
	while (g_dwTimes < MAX_TIMES)
	{
		EnterCriticalSection(&g_cs);
		g_dwTimes[g_nIndex] = GetTickCount();
		g_nIndex++;
		LeaveCriticalSection(&g_cs);
	}
}
DeleteCriticalSection(g_cs);


5、使用关键代码时的技巧和注意点:

a、对每一个共享资源都使用一个CRITICAL_SECTION变量。这样对变量1进行操作时,可以由另一个线程对变量2进行操作;

b、同时访问多个共享资源时,必须以同样的顺序调用EnterCriticalSection(&g_cs),否则有可能引起死锁;

c、不要长时间运行关键代码。长时间运行关键代码,就意味着其他线程一直处于等待阶段。

【文尾】希望时间快点儿跑~~ 如果文章对您有帮助,请留下对我和蟹儿的祝福,谢谢~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值