假设我有一个foo类:classfoo{staticuint32count_;pthread_mutex_tmu;voidincrease(){pthread_mutex_lock(&mu);count_++;pthread_mutex_unlock(&mu);}}如果我不使用互斥量,而只是将std::atomic作为count_,会有什么不同吗?谢谢! 最佳答案 差别很大。pthread_mutex_lock可能非常昂贵,因为它可能包含系统调用*。原子增量产生lockxadd.另一个优势是std::atomic可能更好移植,因为它
我使用Linuxx86_64和clang3.3。这在理论上有可能吗?std::atomic不起作用(对某些函数的undefinedreference)。__atomic_add_fetch也不起作用(“错误:还不能编译这个原子库调用”)。两者都是std::atomic和__atomic_add_fetch使用64位数字。 最佳答案 用一条指令不可能做到这一点,但你可以模拟它并且仍然是无锁的。除了最早的AMD64CPU,x64支持CMPXCHG16B指令。通过一些多精度数学,您可以很容易地做到这一点。恐怕我不知道GCC中CMPXCHG
在我的MAC操作系统上,atomic是无锁的。#include#includeintmain(){std::cout().is_lock_free()我想知道是否atomic总是无锁?有引用介绍吗? 最佳答案 Thestandardallowsimplementinganyatomictype(withexceptionofstd::atomic_flag)tobeimplementedwithlocks.即使平台允许某些类型的无锁原子,标准库开发人员也可能没有实现它。如果您需要在使用锁时实现不同的东西,可以在编译时使用ATOMIC
这是我在.h文件中的声明:staticstd::atomicOrdersExecutorIdCounter;这是来自.cpp文件的初始化:std::atomicActionBasedOrdersExecutor::OrdersExecutorIdCounter=0;它在VC++中编译得很好,但在gcc4.8中我得到这个错误:error:useofdeletedfunction‘std::atomic::atomic(conststd::atomic&)’我该如何解决这个问题? 最佳答案 可以直接初始化原子变量,不需要deleted拷
在尝试使用std原子指针时,我遇到了以下问题。假设我这样做:std::atomicmyString;////AcanIdothis?myString.load()->size()//BcanIdothis?charmyFifthChar=*(myString.load()->c_str()+5);//CcanIdothis?charmyCharArray[255];strcpy(myCharArray,myString.load()->c_str());我很确定C是非法的,因为myString可能同时被删除。但是我不确定A和B。我认为它们是非法的,因为在执行读取操作时指针可能会被引用。
根据en.cppreference.com,std::atomic_exchange和std::atomic_store等价于线程安全的std::swap。但这不是我使用g++或clang++得到的行为。Problemliveoncoliru.(见下文)它虽然打印了这个:std::atomic_storea:0x1ed2c300b:0x1ed2c501a:0x1ed2c501b:0x1ed2c501std::atomic_exchangea:0x1ed2c500b:0x1ed2c301a:0x1ed2c301b:0x1ed2c301这是为什么?难道我做错了什么?我是否误读了文档?代码l
为什么在这个例子中structFoo{atomicx=1;};编译器(gcc4.8)正在尝试使用已删除的atomic&operator=(constatomic&),(因此该示例无法编译),而此处structBar{Bar(){x=1;}atomicx;};它按预期调用intoperator=(int)吗?PS:我已经知道了structXoo{atomicx{1};};很好(无论如何是初始化x的更好方法),但我仍然很好奇为什么Foo坏了。PS:我误读了编译器错误(并忘记将其包含在问题中)。它实际上说:error:useofdeletedfunction‘std::atomic::ato
(这可能是原子递增/递减的一般问题,但我在shared_ptrs领域遇到过这种情况)当原子引用计数器递增和递减时,shared_ptr是否遇到两次缓存行未命中/访问?我确实找到了这个:atomicoperationcost但它似乎并没有过于确定......更新:如果我运行一个循环数百万次,递增一个原子变量,我得到的L1缓存未命中率为0.2。如果我对非原子int做同样的事情,我会得到0L1缓存未命中率......测试将暗示L1缓存行正在被逐出。 最佳答案 shared_ptr必须在某处存储引用计数变量。它可能是从堆中分配的,并且sha
我正在使用C++开发“SimpleSegregatedStorage”内存池的无锁版本。SSS内存池类似于slab分配器:它基本上只是一block内存,被分成大小相等的block,我们有一个指向第一个可用block的空闲列表指针。分配只是将指针向上移动到下一个block,释放只是将空闲列表指针设置为释放block,并将释放block上的“下一个”指针指向自由列表指针的旧值。所以它基本上是一个单链表。现在,我正在尝试编写简单隔离存储算法的无锁版本。如果我们假设隔离初始内存块(即创建链表)总是在进入多线程环境之前完成,我们只需要担心分配和释放block——在这种情况下问题变得非常类似于无锁
以原子方式更新单个位(从std::bitset)的最便宜的技术是什么?我不认为x86BTR是原子的。我想知道我是否必须读取最近的字节然后使用CAS?如果LOCK+BTR是最快的解决方案,我很乐意接受内联的x86-64汇编答案。 最佳答案 BTS/BTR默认不是原子的,但是可以带LOCK前缀。这是我对原子位设置和原子位重置的实现,它适用于Intel64位和32位平台(适用于MSVC、gcc和可能的clang)。ARM的实现也可以从:http://alice.loria.fr/software/geogram/doc/html/atom