一、目的
多线程下需要保持共享资源的一致性。
二、原子访问
InterlockedExchangeAdd(i) = i++;
第一步将i放进寄存器中;第二步i+1;第三步将寄存器中的值写进i;
利用上述函数则可以防止三步被打断。
三、旋转锁
一个线程设置一个while循环不停的访问一个全局变量。
另一个线程则可以控制这个变量的值,来结束前一个线程的while循环。
不值得使用
四、关键段
关键段之间的代码只允许一个线程进入,其他线程被挂起。
InitializeCriticalSection(PCRITTICAL_SECTION) 初始化
EnterCriticalSection(PCRITTICAL_SECTION) 进去 (如果有其他线程进入了,则被挂起)
LeaveCriticalSection(PCRITTICAL_SECTION) 出来
DeleteCriticalSection(PCRITTICAL_SECTION) 删除
TryEnterCriticalSection(PCRITTICAL_SECTION) 检查是否可以进入
InitializeCriticalSectionAndSpanCount(PCRITTICAL_SECTION) (如果进入不了,可以多尝试几次,不必立马挂起)
五、Slim 读写锁
和关键段相同,可以区分读者和写者。
InitializeSRWLock(PSRWLOCK) 初始化
AcquireSRWLockExclusive(PSRWLOCK) 保护写者
ReleaseSRWLockExclusive(PSRWLOCK)
AcquireSRWLockShared(PSRWLOCK) 保护读者
ReleaseSRWLockShared(PSRWLOCK)
六、其他
性能:原子函数小于读写锁小于关键段。
高速缓存:程序访问一个字节时会把一个高速缓存行取回(32字节,64...)。
因为它则要进行内存对齐,把成员变量归类存放在一起。如果希望变量总是从内存中读取则用Volatile修饰。
条件变量:可以配合读写锁进行功能转换(资源满时写者休息,读者工作;资源空时读者休息,写者工作)