首页 文章

Anderson Queue锁定了Solaris

提问于
浏览
2

我需要一个与以下Java类相当的C语言 . 它是一个队列锁,称为线程同步中使用的Anderson Lock . 我不习惯使用C,并且有一些我不太懂的线程类如何使用 . 谢谢 .

我正在使用OpenSolaris .

public class ALock implements Lock {
     ThreadLocal mySlotIndex = new       
     ThreadLocal (){
          protected Integer initialValue() {
               return 0;
          }
     };
     AtomicInteger tail;
     boolean[] flag;
     int size;
     public ALock(int capacity) {
          size = capacity;
          tail = new AtomicInteger(0);
          flag = new boolean[capacity];
          flag[0] = true;
     }
     public void lock() {
          int slot = tail.getAndIncrement() % size;
          mySlotIndex.set(slot);
          while (! flag[slot]) {};
     }
     public void unlock() {
          int slot = mySlotIndex.get();
          flag[slot] = false;
          flag[(slot + 1) % size] = true;
     }
}

1 回答

  • 1

    我假设你指的是本文所述的自旋锁类型:http://homes.cs.washington.edu/~tom/pubs/spinlock.pdf

    出于性能原因,使用这种锁 . 它是有效的,因为每个内核都在一个单独的地址上旋转,该地址保持在其缓存的本地 . 这减少了核心之间的“窥探”缓存流量 .

    但是,当在C中实现它然后从Java调用它时,我很难看到性能优势 .

    无论如何,concurrencykit站点提供了许多不同类型的自旋锁和其他并发相关事物的C实现:

    http://concurrencykit.org/index.html

    此页面包含anderson类型的spinlock的文档:http://concurrencykit.org/doc/ck_spinlock.html

相关问题