我需要一个与以下 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; } }
最佳答案
我假设您指的是本文中描述的自旋锁类型: 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
关于c - Solaris 上的安德森队列锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9191836/