- 论坛徽章:
- 0
|
你说的没错,那那段代码是死锁,给该书作者写信吧。活锁发生以后运气好的时候仍然是可以走出来的,死锁则永远等待,没有任何机会。
活锁大多有一个解锁过程寄希望于另一方可以先走,大概是这样的:
- /* 线程1,2都必须获得两把锁之后再继续工作 */
- lock_t lock1, lock2;
- /* 线程1 */
- thread1_work(void)
- {
- while(1) {
- lock1.lock();
- while (lock2.locked())
- {
- /* 无法获得锁2,于是释放锁1,试图让拥有锁2的线程可以获得锁1 */
- lock1.unlock();
-
- schedule(); /* or schedule_timeout() */
-
- lock1.lock(); /* 再次试图获得两把锁 */
- }
- lock2.lock();
- /* 运气好的时候能到达此处 */
- work_on_resources();
- lock1.unlock();
- lock2.unlock();
- }
- }
- /* 线程2 */
- thread2_work(void)
- {
- while(1) {
- lock2.lock();
- while (lock1.locked())
- {
- lock2.unlock();
-
- schedule();
-
- lock2.lock();
- }
- lock1.lock();
- work_on_resources();
- lock1.unlock();
- lock2.unlock();
- }
- }
复制代码 |
|