1

我的代码中有一个条件,如下所示

    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 上,我对平台特定的解决方案很好,如果它不能被移植也没关系。

4

2 回答 2

1

从某种意义上说,是的,你可以在没有锁的情况下编写上面的代码;但是,我当然同意其他人的观点,即“为什么要取消锁定?” 优化以移除锁可能会提供更好的性能,但值得您花时间和精力将代码专门用于当前需求。话虽如此,这__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));

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

于 2013-07-05T00:14:06.057 回答
0

答案是肯定的,因为 pthread 原语是建立在这些架构原语之上的。

所以问题变成了你想要真正实现什么?

于 2013-07-05T00:01:05.450 回答