用原子代替条件?

时间:2013-07-04 22:46:13

标签: 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上,如果无法移植,我可以使用特定于平台的解决方案。

2 个答案:

答案 0 :(得分: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));

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

答案 1 :(得分:0)

答案是肯定的,因为pthread基元构建在这些架构基元之上。

那么问题就变成了你想要实现的目标?