1.Interlocked系列函数:利用CPU实现,如InterlockedAdd就是lock xadd 指令来实现同步
2,关键段(CRITICAL_SECTION),利用事件内核对象:
利用关键段之前要先InitializeCriticalSection(&g_cs)来初始化一个关键段,在不再使用的时候要利用DeleteCriticalSection中。如果有两个资源A,B,三个线程1,2,3,如果12线程访问A资源,13线程访问B资源,那么就要创建两个关键段并在1线程调用两次EntryCriticalSection
3,如果有一个线程已经在访问资源,则另一个线程调用EntryCriticalSection后会使用一个事件内核对象来把调用进程切换到等待状态。如果很长时间都不会返回,那么EntryCriticalSection就会超时并引发异常,另一个函数则不会让线程进入等待状态,而是通过返回TRUE和FASLE来判断释放资源被占用。
4,SpainLock (旋转锁) , 旋转所就是通过一个while循环一直检测一个量是否被占用,这个时间会比进入内核设置内核事件短一些,所以在多处理器上可以旋转锁和关键段一起使用,在初始化时候调用InitializeCriticalSectionAndSpainCount
5,Slim读写锁(SRWLock):
这是对资源进行读或写的时候用的,在只读模式下可以多个线程同时读取,在只写模式下只能是一个线程进行写入,在使用前一样要声明一个SRWLOCK结构,并且在只读资源前面用, 在结束的时候用ReleaseSRWLockShared,这个不用进行释放,系统会自动清理。进行只写资源前面用,在释放时候用ReleaseSRWLockExclusive来释放。
6,volatile这个不需要同步。
7,性能一般是:volatile > Interlocked > SRWLock >= CriticalSection > Mutext等内核事件
8,条件变量:一个用于关键段,一个用于SRWLock, 对应着或 WakeAllConditionVarible