Блокировка очереди Андерсона в Солярисе - PullRequest
2 голосов
/ 08 февраля 2012

Мне нужен 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 Ответ

1 голос
/ 21 ноября 2013

Я предполагаю, что вы имеете в виду тип спин-блокировки, описанный в этой статье: 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

...