Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;原子与锁_C++_Pthreads_Atomic - Fatal编程技术网

C++ c++;原子与锁

C++ c++;原子与锁,c++,pthreads,atomic,C++,Pthreads,Atomic,假设我有一个foo类: class foo { static uint32 count_; pthread_mutex_t mu; void increase() { pthread_mutex_lock(&mu); count_++; pthread_mutex_unlock(&mu); } } 如果我不使用互斥体,而只使用std::atomic作为count\ux,有什么区别吗 谢谢 有很大的区别pthr

假设我有一个foo类:

class foo {
    static uint32 count_;
    pthread_mutex_t mu;

    void increase() {
      pthread_mutex_lock(&mu);
      count_++;
      pthread_mutex_unlock(&mu);
    }
}
如果我不使用互斥体,而只使用std::atomic作为count\ux,有什么区别吗


谢谢

有很大的区别
pthread\u mutex\u lock
可能非常昂贵,因为它可能包含一个系统调用*。原子增量产生

另一个优点是,它可能是更好的便携式,因为它是C++标准的一部分。Pthread调用很可能在Windows中不起作用


*)如果锁已由其他线程持有,则让当前线程休眠。但最有可能的情况是只会发生一次。

互斥锁实际上很可能是作为一个原子增量本身实现的,而且如果您运气不好,在锁上发生争用,也涉及到一个系统调用[当然,假设这两种方式都不是系统调用!]

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

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

所以,是的,选择原子弹

但就像所有与绩效相关的事情一样,一定要测量“之前”和“之后”,以确保它确实能提高绩效


注意,我看到有人解释了原来的GNU C++标准库实现实际上是使用了某种互斥操作,但是我相信如果你有一个合理的G+版本,那么它应该是好的(至少对于x86型处理器)。长期以来,微软一直支持将适当的原子操作作为内置操作,因此在这方面应该是不错的。其他处理器架构可能会有所不同

uint32
应该是
uint32\u t
。我猜
atomc32
std::atomic
@OP您能澄清一下您所说的
atomc32
是什么意思吗?如果这是一个特定于平台的头文件,你能添加相关信息吗?@jogojapan Linux和FreeBSD内核代码都使用原子32_t,但我很确定这不是问题所在。;)但是你是对的,我会删除C++11标记。对不起,我是说std::atomic。。。我不知道是否还有其他原子类型…所以我可以声明静态std::atomic count然后count++吗?