我需要一个与以下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;
}
}
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