Anderson Queue锁定了Solaris

时间:2012-02-08 10:49:30

标签: c multithreading synchronization pthreads solaris

我需要与以下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 个答案:

答案 0 :(得分: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