c++原子与锁



假设我有一个类foo:

class foo {
    static uint32 count_;
    pthread_mutex_t mu;
    void increase() {
      pthread_mutex_lock(&mu);
      count_++;
      pthread_mutex_unlock(&mu);
    }
}

如果我不使用互斥,而只使用std::atomic作为count_,这有什么区别吗?

谢谢!

这是一个巨大的差异。pthread_mutex_lock可能非常昂贵,因为它可能包含系统调用*。原子增量产生CCD_ 2。

另一个优点是std::atomic<...>可能更易于移植,因为它是C++标准的一部分。Pthread调用很可能在Windows中不起作用。

*(如果锁已经被其他线程持有,则让当前线程休眠。但很可能只会发生自旋锁定

事实上,互斥锁很可能是作为原子增量实现的,如果你运气不好,在锁上发生争用,也涉及到系统调用[当然,假设它不是系统调用!]。

x86上的原子解决方案将是一个简单的"加锁"操作。在其他处理器上,它可能更复杂,但即便如此,原子是互斥体所需的最小值,所以无论如何,您至少要做那么多工作。

然后添加互斥锁解锁,这可能没有那么复杂,但也不会完全免费。

所以,是的,选择原子弹。

但是,就像所有与性能有关的事情一样,一定要测量"之前"one_answers"之后",看看它确实能提高性能。

注意,我看到有人解释说,最初的gnu C++标准库实现实际上是在操作中使用某种互斥体完成的,但我相信,如果你有一个相当新的g++版本,它应该是可以的(至少对于x86类型的处理器(。很长一段时间以来,微软一直支持将适当的原子操作作为内置操作,因此应该可以。其他处理器体系结构可能有所不同。

相关内容

  • 没有找到相关文章

最新更新