Windows核心编程 --- 线程同步

1.Interlocked系列函数:利用CPU实现,如InterlockedAdd就是lock xadd 指令来实现同步

    InterlockedExchangeAdd / InterlockedExchangeAdd64 / InterlockedIncrement / InterlockedAdd / InterlockedCompareExchange / InterlockedCompareExchangePointer / InterlockedCompareExchange64 / InterlockedAnd(OR,XOR)64

2,关键段(CRITICAL_SECTION),利用事件内核对象:

利用关键段之前要先InitializeCriticalSection(&g_cs)来初始化一个关键段,在不再使用的时候要利用DeleteCriticalSection来释放,并且要实现同步的代码要放在 EnterCriticalSection 和 LeaveCriticalSection 中。如果有两个资源A,B,三个线程1,2,3,如果12线程访问A资源,13线程访问B资源,那么就要创建两个关键段并在1线程调用两次EntryCriticalSection

3,如果有一个线程已经在访问资源,则另一个线程调用EntryCriticalSection后会使用一个事件内核对象来把调用进程切换到等待状态。如果很长时间都不会返回,那么EntryCriticalSection就会超时并引发异常,另一个函数TryEntryCriticalSection  则不会让线程进入等待状态,而是通过返回TRUE和FASLE来判断释放资源被占用。

4,SpainLock (旋转锁) , 旋转所就是通过一个while循环一直检测一个量是否被占用,这个时间会比进入内核设置内核事件短一些,所以在多处理器上可以旋转锁和关键段一起使用,在初始化时候调用InitializeCriticalSectionAndSpainCount  ,设置旋转所的次数,可以通过SetCriticalSectionSpainCount来改变次数,如果只有一个处理器则会忽略旋转所,因为这样会更损失性能。

5,Slim读写锁(SRWLock):

这是对资源进行读或写的时候用的,在只读模式下可以多个线程同时读取,在只写模式下只能是一个线程进行写入,在使用前一样要声明一个SRWLOCK结构,并且在只读资源前面用AcquireSRWLockShared , 在结束的时候用ReleaseSRWLockShared,这个不用进行释放,系统会自动清理。进行只写资源前面用AcquirdSRWLockExclusive ,在释放时候用ReleaseSRWLockExclusive来释放。

6,volatile这个不需要同步。

7,性能一般是:volatile > Interlocked > SRWLock >= CriticalSection > Mutext等内核事件

8,条件变量:SleepConditionVariableCS 或 SleepConditionVariableSRW 一个用于关键段,一个用于SRWLock, 对应着WakeConditionVaribale WakeAllConditionVarible 



猜你喜欢

转载自blog.csdn.net/a893574301/article/details/80709445