Windows 线程(十三) Slim锁以及线程的状态补充
Slim锁
我们加锁, 或者使用临界区, 都是为了在我们访问同一资源的时候, 不会出错
我们对同一资源进行操作, 也就是 读 和 写 这两种
多条线程都是读
- 那么它
不会出现安全问题
- 那么它
多条线程读, 一条线程写
会出现安全问题
多条线程写
会出现安全问题
我们发现, 只要有写操作, 就会牵扯到安全问题
那么, 我们在一条线程写, 多条线程读的情况下
需要进行数据同步, 来让我的其他线程知道什么时候写线程写完了
用已经学过的锁, 或者临界区, 效率都会比较低
因为仅仅是为了一个线程的写安全, 导致所有的读线程都加锁
那么有没有一种锁, 在我的所有读的线程中都不锁, 只保证写线程是安全的呢?
接下来让我们认识 Slim锁
Slim锁
- 是轻量级的读写锁
- 英文全称 Slim Reader-Write Lock
- 是一个
SRWLOCK结构体 它的使用比较简单, 经过如下几步
- InitializeSRWLock(&g_SRW); // 初始化, 这样就可以了
- 它
不需要Delete AcquireSRWLockExclusive(&g_SRW); // 以独占方式加锁
- 主要应用于
写操作的线程
- 主要应用于
- ReleaseSRWLockExclusive(&g_SRW); // 解独占锁
AcquireSRWLockShared(&g_SRW); // 以共享方式加锁
- 只要没有
独占方式锁, 所有线程都可以访问这个资源
- 只要没有
- ReleaseSRWLockShared(&g_SRW); // 解共享锁
- 无需删除, 当不再需要使用Slim锁时, 系统会自动销毁
与临界区的区别
临界区和Slim比较相似, 但是各有优劣
Slim的好处:
- 可区分
读写操作, 可上共享锁 - 效率比临界区高
Slim的劣势:
一旦上了
独占锁,共享锁的线程会被阻塞- 也就是
读线程会变成不可调度状态 - 它没有临界区的
TryEnter
- 也就是
无法递归使用, 必须成套使用
- 临界区可以多次Enter多次Leave
- 而Slim必须在Acquire后马上Release
线程状态
线程的挂起, 休眠, 阻塞, 等待状态都会使线程不可调度 不可调度状态的线程可以释放CPU
当收到操作系统发送的通知说线程可以恢复运行的时候, 线程就又变成了可调度状态 休眠, 阻塞, 等待都是系统来操作管理的
而挂起则是人为的
它是人为的通过API来时线程内核对象的暂停计数+1
以达到通知系统内核挂起线程的目的
本质上, 以上状态都是一样的
线程可以被认为只有两种状态, 可调度状态, 不可调度状态
未完待续...
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-06-27 at 03:50 pm