c - 用原子替换条件?

标签 c atomic spinlock

我的代码中有如下条件

    pthread_spin_lock(&slock);
    if (round_robin_next_ == hp_count() - 1 ) {
      round_robin_next_ = 0;
    } else  {
      round_robin_next_++;
    }
   pthread_spin_unlock(&slock);

我使用了一个自旋锁为了让上面的线程安全,并且确保每个线程得到的round_robin_next_的下一个值与前一个相比。如您所见,round_robin_next_ 是循环的,上升到某个值然后返回到 0。

我的问题是,上面的代码能否通过使用 gcc 内部函数以某种方式释放锁?或一些特定于平台的说明?我在使用 gcc 4.7 的 64 位 Linux 上,我对平台特定的解决方案很好,如果它不能被移植也没关系。

最佳答案

从某种意义上说,是的,你可以在没有锁的情况下编写上面的代码;但是,我当然同意其他人的意见,因为存在“为什么要取消锁定?”的问题。优化以移除锁可能会提供更好的性能,但是值得您花时间和精力专门针对当前需求编写代码。话虽如此,__sync_bool_compare_and_swap 足以实现几乎任何同步算法。例如:

do {
  old = round_robin_next_;
  if (old == hp_count() - 1) { new = 0; }
  else { new = old + 1; }
} while (!__sync_bool_compare_and_swap(&round_robin_next_, old, new));

内在原子地评估内存位置是否仍然包含旧的,如果是,则将新的存储到该位置。如果该位置不仍然包含旧的,则返回 false 并再次尝试更新。

关于c - 用原子替换条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17478956/

相关文章:

c++ - 我可以将代码放在 case 之外的 switch 中吗?

c - 如何正确地将输入扫描到 C 中的结构中并将其显示出来?

c++ - 放宽顺序作为信号

linux - linux内核中spinlock_t的定义

java - SpinLock 可扩展性和限制

c - 如何用前导零填充整数打印?

c++ - 为什么这个 cppreference 摘录似乎错误地暗示原子可以保护关键部分?

c++ - 内联函数是原子的吗?

C 中的组合信号量和自旋锁?

c - 为什么即使我遵循 "Hacking-The art of exploitation"书中的代码也无法使程序崩溃