【文起】亲爱的蟹儿,想念你就是我坚持下去的动力。为了每天能一起喝红酒,奋斗,嘻嘻
用户方式中线程的同步
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、不要长时间运行关键代码。长时间运行关键代码,就意味着其他线程一直处于等待阶段。
【文尾】希望时间快点儿跑~~ 如果文章对您有帮助,请留下对我和蟹儿的祝福,谢谢~~