代码改变世界

2013-02-28 16:30  ggzwtj  阅读(306)  评论(0编辑  收藏  举报

设计良好的锁应该具有的性质:

  1. 互斥:这个是必须的,否则无法保证操作的正确性。
  2. 无死锁:有多个线程tryAcquire锁时,保证其中一些会成功。
  3. 无饥饿:某一个线程不停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 }