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

匿名 (未验证) 提交于 2019-12-03 00:27:02

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



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!