我需要与以下Java类等效的C语言。它是一个队列锁,称为线程同步中使用的Anderson Lock。我不习惯使用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; } }
答案 0 :(得分:1)
我假设你指的是本文所述的自旋锁的类型: http://homes.cs.washington.edu/~tom/pubs/spinlock.pdf
出于性能原因,使用此类锁定。它是有效的,因为每个内核都在一个单独的地址上旋转,该地址保持在其缓存的本地。这减少了核心之间的“窥探”缓存流量。
但是,当在C中实现它然后从Java调用它时,我很难看到性能优势..
在任何情况下,concurrencykit站点都提供了许多不同类型的自旋锁和其他并发相关事物的C实现:
http://concurrencykit.org/index.html
此页面包含anderson类型的spinlock的文档: http://concurrencykit.org/doc/ck_spinlock.html