您的位置:首页 > 编程语言

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

2011-12-03 21:29 232 查看
【文起】亲爱的蟹儿,想念你就是我坚持下去的动力。为了每天能一起喝红酒,奋斗,嘻嘻

用户方式中线程的同步
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、不要长时间运行关键代码。长时间运行关键代码,就意味着其他线程一直处于等待阶段。

【文尾】希望时间快点儿跑~~ 如果文章对您有帮助,请留下对我和蟹儿的祝福,谢谢~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: