2012-02-08 3 views
2

Мне нужен C-эквивалент следующего Java-класса. Это блокировка очереди, известная как блокировка Андерсона, используемая в синхронизации потоков. Мне не удобно использовать C, и есть некоторые классы потоков, которые я действительно не знаю, как использовать. Благодарю.Anderson Queue lock on Solaris

Я использую 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/index.html

Эта страница содержит документацию для типа андерсоновской: спин-блокировки http://concurrencykit.org/doc/ck_spinlock.html