C++ c++;原子与锁
假设我有一个foo类: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
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++吗?