锁
2013-02-28 16:30 ggzwtj 阅读(306) 评论(0) 编辑 收藏 举报设计良好的锁应该具有的性质:
- 互斥:这个是必须的,否则无法保证操作的正确性。
- 无死锁:有多个线程tryAcquire锁时,保证其中一些会成功。
- 无饥饿:某一个线程不停tryAcquire锁时,总会成功。
Lock1:
1 class Lock1: public Lock { 2 private: 3 volatile bool flag[2]; 4 public: 5 void acquire() { 6 int other_threadid = 1 - self_threadid; 7 flag[self_threadid] = true; 8 while (flag[other_threadid] == true); 9 } 10 void release() { 11 flag[self_threadid] = false; 12 } 13 }
在一个线程acquire之后会将自己的标志位设置为true。如果两个线程同时acquire并且都执行到了自旋操作之前,那么这时显然就发生了死锁。也就是说这个锁要正常运行,必须保证【7、8】是原子的。
Lock2:
1 class Lock2: public Lock { 2 private: 3 volatile int victim; 4 public: 5 void acquire() { 6 victim = self_threadid; 7 while (victim == self_threadid); 8 } 9 void release() { } 10 }