2012-02-08 17 views
2

次のJavaクラスに相当するCが必要です。これは、スレッド同期で使用されるアンダーソン・ロックと呼ばれるキュー・ロックです。私はCを使用するのが快適ではなく、使用方法がわからないスレッドクラスがいくつかあります。ありがとう。Solaris上のAndersonキューロック

私は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

私はあなたがこの論文に記載のスピンロックのタイプを参照していると仮定: http://homes.cs.washington.edu/~tom/pubs/spinlock.pdf

ロックのこの種のは、パフォーマンス上の理由のために使用されています。これは、各コアが別々のアドレス上で回転し、そのキャッシュにローカルに残るため、効率的です。これにより、コア間の「スヌーピング」キャッシュトラフィックが減少します。

Cでこれを実装してから、Javaからそれを呼び出すときに、私はいずれにしても...

を参照するただし、パフォーマンス上の利点が困難な、concurrencykitサイトは、異なる種類の数のCの実装を提供しますスピンロックやその他の並行処理に関連する事柄: http://concurrencykit.org/doc/ck_spinlock.html

http://concurrencykit.org/index.html

このページでは、スピンロックのアンダーソンタイプの資料を持っています

関連する問題