线程的状态
线程拥有的状态:
- 初始化:准备创建线程。
- 就绪:等待线程执行。
- 运行:调用该线程,执行逻辑。
- 阻塞:该线程被挂起,等待重新唤醒,阻塞包括锁、事件、信号量阻塞,延迟等。
- 退出:结束线程并释放资源。
线程的竞争状态:
- 竞争状态:包括读写状态的竞争
- 临界区:读写数据的代码片段
为了保护临界区的状态,一般使用锁来控制。
使用锁
一般锁
一般可以使用锁来保证对临界区的控制:
1 |
|
这是锁最普通的用法,但上述逻辑存在bug:当锁使用完成后释放锁,在for中跳转到下一个逻辑是相当快的,就可能导致unlock后还未来得及释放就再次上锁,导致下一个循环逻辑阻塞。
因此可以延后来确保锁被释放:
1 | //... |
超时锁
超时锁可以记录锁的获取情况,如果获取到锁则返回true,大致使用如下:
1 |
|