本笔记整理自:《Windows核心编程(第五版)》
目录
InterlockedIncrement(LONG volatile *Addend) // *Addend++;
InterlockedDecrement(LONG volatile *Addend) // *Addend--;
InterlockedExchangeAdd(LONG volatile *Addend,LONG Value) // *Addend+=Value;
InterlockedExchangeSubtract(LONG volatile *Addend,LONG Value) // *Addend-=Value;
InterlockedExchange(LONG volatile *Target,LONG Value) // *Target=Value;
TInterlockedExchangePointer(PVOID volatile *Target,PVOID Value) // *Target=&Value;
InterlockedCompareExchange(LONG volatile *Target,LONG Exchange,Long Compared) // if(*Target==Compared) *pDest=Exchange;
InterlockedCompareExchangePointer(PVOID volatile *Target,PVOID Exchange,PVOID Compared) // if(*pDest==pCompare) pDest=&value;
是一种实现原子操作的较为简单的方式
相关用法
//Samples:
CRITICAL_SECTION g_cs;
InitializeCriticalSection(&g_cs);
void thread_enter_function()
{
EnterCriticalSection(&g_cs);
//访问线程共享的变量
//在此范围内,涉及到的数据只允许一个线程使用
//To-DO:...
LeaveCriticalSection(&g_cs);
}
相关函数
//初始化
VOID InitializeCriticalSection(PCRITICAL_SECTION* pcs);
//删除变量。当不需要这一结构体时,就可以调用此方法删除此变量
VOID DeleteCriticalSection(PCRITICAL_SECTION* pcs);
// 是否允许访问,可以用此函数代替EnterCriticalSection
// 每一个返回true的TryEnterCriticalSection的调用必须搭配一个LeaveCriticalSection
// 非挂起式关键段访问
// 若有其他线程访问此关键段,则返回FALSE。可以访问则放回TRUE
BOOL TryEnterCriticalSection(PCRITICAL_SECTION pcs);
//进入关键段(当有其他在访问时会挂起)
VOID EnterCriticalSection(PCRITICAL_SECTION pcs);
//离开关键段
VOID LeaveCriticalSection(PCRITICAL_SECTION pcs);
//设置挂起前试图访问锁的次数
//也就是说:若当前有其他地方正在访问关键段时,此处持续访问的次数,若超过这一次数,此处将会挂起。
SetCriticalSectionSpinCount(PCRITICAL_SECTION pcs,DWORD dwSpinCount);
//设置挂起前试图访问锁的次数并初始化变量
InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION pcs,DWORD dwSpinCount);
内核对象的同步是用什么来实现原子访问的呢?关键函数就是等待函数。
/*
/*
基于此等待函数,下面将介绍四种内核对象。
事件内核是最基本的对象。它主要管理:
人工重置事件VS自动重置事件
相关函数
/*
/*
BOOL SetEvent(HANDLE hEvent); //把事件设置为触发状态
BOOL ResetEvent(HANDLE hEvent); //把事件设置为未触发状态
BOOL PulseEvent(HANDLE hEvent); //触发一次或设置为未触发,相当于激发一次。(不常用)
在某个事件或按规定的间隔事件发出自己的信号通知的内核对象。
相关函数
/*
//打开已存在的计时器内核对象
HANDLE OpenWaitableTimer(PSECURITY_ATTRIBUTES psa,BOOL bManualReset,PCTSTR pszName)
/*
//取消计时器
BOOL CancelWaitableTimer(HANDLE hTimer);
用来对资源进行计数。它的规则如下:
相关函数
HANDLE CreateSemaphore(PSECURITY_ATTRIBUTES psa,LONG lInitialCount,LONG lMaximumCount,PCTSTR pszName);
HANDLE OpenSemaphore(DWORD dwDesiredAccess,BOOL bInheritHandle,PCTSTR pszName);
/*
用来确保一个线程独占对一个资源的访问。
包含一个实用技术、线程ID以及一个递归计数
互斥量规则如下
等待函数不在返回WAIT_OBJECT0,而是返回特殊的值WAIT_ABANDONED
互斥量和关键段的比较
特征
互斥量
关键段
性能
慢
快
是否能跨进程使用
是
否
声明
HANDLE hmtx;
CRITICAL_SECTION cs;
初始化方式
hmtx=CreateMutex(NULL,FALSE,NULL);
InitializeCriticalSection(&cs);
清理
CloseHandle(hmtx);
DeleteCriticalSection(&cs);
无限等待
WaitForSingleObject (hmtx, INFINITE);
EnterCriticalSection(&cs);
0等待
WaitForSingleObject (hmtx, 0);
TryEnterCriticalSection(&cs);
任意长时间的等待
WaitForSingleObject (hmtx, timeLength)
不支持
释放
ReleaseMutex(hmtx);
LeaveCriticalSection(&cs);
是否能同时等待其他内核对象
是(WaitForMultipleObjects或其他)
否
相关函数
/*
HANDLE OpenMutex(
DWORD dwDesiredAccess,
BOOL bInitialOwner,
PCTSTR pszName
);
BOOL ReleaseMutex(HANDLE hMutex);
手机扫一扫
移动阅读更方便
你可能感兴趣的文章