c - Solaris 上的安德森队列锁

标签 c multithreading synchronization pthreads solaris

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

相关文章:

swift - 在 cocoa 后台连续运行代码

c - 是否可以从父线程访问/更新子线程的资源?

java - Java 中的 Ada 交会对应物

synchronization - 当 OSX 发生任何变化时,如何触发统一同步文件和目录?

java - 线程应用程序将重复行写入日志文件

java - Java中两个同步块(synchronized block)的区别

c - 在 C 中定义弹性/柔性结构

无法在 CUDA 中返回指针

c - 未初始化的值是由堆栈分配创建的 - valgrind

c - 如何将数组中的值存储到 MPLAB 上的变量中?