windows下线程同步。
一般来说可以分为两种,用户模式下和内核模式下,而内核模式下可以同步进程间,当然包括了线程间
用户模式下的同步:
1、原子锁:
Interlocked函数,不用切换用户态和内核态,速度快,当然和volatile 还有有点差距,进行的操作一般是++和---;或者+-一个整数;
2、关键段 critical section
以原子的方式对一个代码段(资源)进行原子访问,主要是对CRITICAL_SECTION 进行操作,用前Init,用后Delete,主要是EnterCriticalSection和LeaveCriticalSection
也可以和自旋锁结合使用,InitializeCriticalSectionAndSpinCount,SetCriticalSectionSpinCount。
如果等待的资源被占用,那么会触发一个内核事件将此线程切换到等待转态,直到有资源了再切换回来。这种方式较原子锁还是耗时了些,为了提高效率就是和spin一起使用,
进入关键段时候,使用spin(比较耗cpu,所以这个度不好把握需要测试,一般用4000),spin消耗完了后还没等到资源就进入转态切换。
3、读/写锁
原理是共享资源防止写时候冲突,同一时刻可以让多个线程读,但是只能有一个线程写;
AcquireSRWLockExclusive、ReleaseSRWLockExclusive
ACquireSRWLockShared、ReleaseSRWLockShared
内核模式下
1、互斥量 CreateMutex
2、事件 CreateEvent
3、信号量 CreateSemaphore
其他地方可能有的叫信号灯,信号量的一个特例可以理解为mutex,信号量的资源可以有多个,当减为0的时候就不能进去,即没有资源可以分配,知道其他资源释放。