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