-【用户方式线程同步】关键代码段
2011-08-26 13:24
253 查看
关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权。
下面是个有问题的代码,它显示了不使用关键代码段会发生什么情况:
const int MAX_TIMES = 1000;
int g_nIndex = 0;
DWORD g_dwTimes[MAX_TIMES];
DWORD WINAPI FirstThread(PVOID pvParam)
{
while(g_nIndex < MAX_TIMES)
{
g_dwTimes[g_nIndex] = GetTickCount();
g_nIndex++;
}
return(0);
}
DWORD WINAPI SecondThread(PVOID pvParam)
{
while(g_nIndex < MAX_TIMES)
{
g_nIndex++;
g_dwTimes[g_nIndex - 1] = GetTickCount();
}
return(0);
}
上面的代码存在一个问题,那就是g_dwTimes不会被正确地填入数据,因为两个线程函数要同时访问相同的全局变量。
const int MAX_TIMES = 1000;
int g_nIndex = 0;
DWORD g_dwTimes[MAX_TIMES];
CRITICAL_SECTION g_cs;
DWORD WINAPI FirstThread(PVOID pvParam)
{
while(g_nIndex < MAX_TIMES)
{
EnterCriticalSection(&g_cs);
g_dwTimes[g_nIndex] = GetTickCount();
g_nIndex++;
LeaveCriticalSection(&g_cs);
}
return(0);
}
DWORD WINAPI SecondThread(PVOID pvParam)
{
while(g_nIndex < MAX_TIMES)
{
EnterCriticalSection(&g_cs);
g_nIndex++;
g_dwTimes[g_nIndex - 1] = GetTickCount();
LeaveCriticalSection(&g_cs);
}
return(0);
}
这里指定了一个CRITICAL_SECTION数据结构g_cs,然后在对EnterCriticalSection和Lea veCriticalSection函数调用中封装了要接触共享资源(在这个例子中为g_nIndex和g_dwTimes)的任何代码。
注意:编写的需要使用共享资源的任何代码都必须封装在EnterCriticalSection和LeaveCriticalSection函数中。
当无法用互锁函数来解决同步问题时,你应该试用关键代码段。
关键代码段的优点
它们的使用非常容易,它们在内部使用互锁函数,这样它们就能够迅速运行。
关键代码的主要缺点
无法用它们对多个进程中的各个线程进行同步。
下面是个有问题的代码,它显示了不使用关键代码段会发生什么情况:
const int MAX_TIMES = 1000;
int g_nIndex = 0;
DWORD g_dwTimes[MAX_TIMES];
DWORD WINAPI FirstThread(PVOID pvParam)
{
while(g_nIndex < MAX_TIMES)
{
g_dwTimes[g_nIndex] = GetTickCount();
g_nIndex++;
}
return(0);
}
DWORD WINAPI SecondThread(PVOID pvParam)
{
while(g_nIndex < MAX_TIMES)
{
g_nIndex++;
g_dwTimes[g_nIndex - 1] = GetTickCount();
}
return(0);
}
上面的代码存在一个问题,那就是g_dwTimes不会被正确地填入数据,因为两个线程函数要同时访问相同的全局变量。
const int MAX_TIMES = 1000;
int g_nIndex = 0;
DWORD g_dwTimes[MAX_TIMES];
CRITICAL_SECTION g_cs;
DWORD WINAPI FirstThread(PVOID pvParam)
{
while(g_nIndex < MAX_TIMES)
{
EnterCriticalSection(&g_cs);
g_dwTimes[g_nIndex] = GetTickCount();
g_nIndex++;
LeaveCriticalSection(&g_cs);
}
return(0);
}
DWORD WINAPI SecondThread(PVOID pvParam)
{
while(g_nIndex < MAX_TIMES)
{
EnterCriticalSection(&g_cs);
g_nIndex++;
g_dwTimes[g_nIndex - 1] = GetTickCount();
LeaveCriticalSection(&g_cs);
}
return(0);
}
这里指定了一个CRITICAL_SECTION数据结构g_cs,然后在对EnterCriticalSection和Lea veCriticalSection函数调用中封装了要接触共享资源(在这个例子中为g_nIndex和g_dwTimes)的任何代码。
注意:编写的需要使用共享资源的任何代码都必须封装在EnterCriticalSection和LeaveCriticalSection函数中。
当无法用互锁函数来解决同步问题时,你应该试用关键代码段。
关键代码段的优点
它们的使用非常容易,它们在内部使用互锁函数,这样它们就能够迅速运行。
关键代码的主要缺点
无法用它们对多个进程中的各个线程进行同步。
相关文章推荐
- Windows编程-- 用户方式中线程的同步---关键代码段(临界区)
- windows笔记-【用户方式线程同步】关键代码段
- 线程同步 关键代码段 CRITICAL_SECTION 用户模式同步对象 InitializeCriticalSection
- 利用关键代码段实现线程同步
- C8、 用户方式的线程同步
- -【用户方式线程同步】互锁的函数家族
- VC++多线程,互斥对象,事件对象,关键代码段实现线程同步
- 利用关键代码段实现线程同步
- C++多线程编程例子 Demo 关键代码段 临界区 实现线程同步
- 用户模式下线程同步之关键段
- windows核心编程之用户方式中的线程同步
- 多线程编程Demo[关键代码段[临界区]实现线程同步]
- windows多线程系列004_利用关键代码段实现线程同步
- 线程同步使用方法:CMutex_CEvent_关键代码段
- 使用关键代码段实现线程同步
- 读书笔记:Windows核心编程第八章---用户方式中的线程同步技巧
- VC++深入详解——第16章:线程同步,关键代码段
- window下线程同步之(Critical Sections(关键代码段、关键区域、临界区域)
- windows笔记-【用户方式线程同步】互锁的函数家族
- 用户方式中线程同步