Блокировка очереди Андерсона на Солярисе


Мне нужен c-эквивалент следующего класса Java. Это блокировка очереди, известная как блокировка Андерсона, используемая в синхронизации потоков. Мне неудобно использовать 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 2

1 ответ:

Я предполагаю, что вы имеете в виду тип блокировки вращения, описанный в этой статье: http://homes.cs.washington.edu/~tom / pubs / spinlock. pdf

Этот вид блокировки используется по соображениям производительности. Это эффективно, потому что каждое из ядер вращается по отдельному адресу, который остается локальным для его кэша. Это уменьшает" слежку " за трафиком кэша между ядрами.

Однако, при реализации этого в C и последующем вызове его из Java, преимущества производительности трудно для меня видеть..

В любом случае, сайт concurrencykit предоставляет c-реализации ряда различных типов spinlocks и других связанных с параллелизмом вещей:

Http://concurrencykit.org/index.html

На этой странице представлена документации по типу блокировки Андерсон : http://concurrencykit.org/doc/ck_spinlock.html