繁体   English   中英

c ++ atomic vs lock

[英]c++ atomic vs lock

假设我有一个类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可能非常昂贵,因为它可能包含一个系统调用*。 原子增量产生lock xadd

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

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

事实上,互斥锁实际上很可能是作为一个原子增量实现的,并且如果你在锁上获得争用的运气不好,还涉及系统调用[假设当然,它不是一个系统无论如何都要打电话!]。

x86上的原子解决方案将是一个简单的“锁定添加”操作。 在其他处理器上它可能更复杂,但即便如此,原子是互斥量所需的最小值,因此无论如何你至少要有这么多的工作量。

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

所以,是的,去原子。

但是就像所有与性能有关的事情一样,请测量“之前”和“之后”,看看它确实提高了性能。

请注意,我看到有人解释说原来的gnu C ++标准库实现实际上是使用某种互斥操作完成的,但我相信如果你有一个合理的最新版本的g ++它应该没问题(至少对于x86类型的处理器) )。 微软很长一段时间都支持内置的正确的原子操作,所以应该没问题。 其他处理器架构可能有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM