草庐IT

c++ - is_lock_free 未在 gcc 4.7.2 的 std::atomic<T> 中定义?

我遇到这个编译器错误functionstd::atomic::is_lock_free()const:error:undefinedreferenceto'__atomic_is_lock_free'whencompilingcodelikebelowusinggcc4.7.2onlinux.structS{inta;intb;};std::atomics;cout 最佳答案 AtomicAPIisn'tcompleteinGCC4.7:Whenlockfreeinstructionsarenotavailable(eitherth

c++ - c++11(atomic)的获取释放操作

#include#include#includeclassatomicAcquireRelease00{public:atomicAcquireRelease00():x(false),y(false),z(0){}voidrun(){std::threada(&atomicAcquireRelease00::write_x,this);std::threadb(&atomicAcquireRelease00::write_y,this);std::threadc(&atomicAcquireRelease00::read_x_then_y,this);std::threadd(&at

c++ - 我需要 std::atomic<bool> 还是 POD bool 足够好?

考虑这段代码://globalstd::atomicrun=true;//thread1while(run){/*dostuff*/}//thread2/*dostuffuntilit'stimetoshutdown*/run=false;我在这里需要与原子变量相关的开销吗?我的直觉是,bool变量的读/写或多或少是原子的(这是一个常见的g++/Linux/Intel设置),如果有一些写/读时序异常,我在线程1上的运行循环会停止一个结果是早晚通过,对于这个应用程序我不是很担心。还是我在这里遗漏了一些其他考虑因素?查看perf,我的代码似乎在std::atomic_bool::opera

c++ - 为什么 C/C++ 编译器并不总是使++ 成为原子?

如题,当我们在C/C++中编写++a时,编译器似乎可能将其编译为:incdwordptr[i]这是原子的,或者:moveax,dwordptr[i]inceaxmovdwordptr[i],eax这不是原子的。将其编译为非原子样式有什么好处吗? 最佳答案 如果您的代码看起来像这样怎么办?++a;if(a>1){...}如果编译器使用第一种表示,它会访问内存以递增a,然后再次访问内存以与1进行比较。在第二种情况下,它访问内存一次获取值并将其放入eax。然后它简单地将寄存器eax与1进行比较,这明显更快。

c++ - 如何测试 std::memory_order_relaxed 的行为?

我已经阅读了std::memory_order_relaxed的文档.Relaxedordering的部分解释是......//Thread1:r1=y.load(memory_order_relaxed);//Ax.store(r1,memory_order_relaxed);//B//Thread2:r2=x.load(memory_order_relaxed);//Cy.store(42,memory_order_relaxed);//D对此的解释是……[It]isallowedtoproducer1==r2==42.Inparticular,thismayoccurifDisc

c++ - 原子 vector 完全线程安全?

我有一个std::vector>vec。运行安全吗vec[index].fetch_add(1,std::memory_order_release)或在其上存储/加载多个并发线程?我认为应该是这样,因为读取是线程安全的,并且由于原子性,不可能同时从多个线程写入一个条目-对吗? 最佳答案 不,一般来说,它不是线程安全的,因为容器本身不是原子的。也就是说,只要您不更改vector中的内容(即做任何使data()的返回无效的事情),您就没事。遗憾的是你不能求助于std::atomic>作为std::vector不是可简单复制。

C++11 原子 x86 内存排序

在C++0x中原子变量的文档之一中,在描述内存顺序时,它提到:Release-AcquireOrderingOnstrongly-orderedsystems(x86,SPARC,IBMmainframe),release-acquireorderingisautomatic.NoadditionalCPUinstructionsareissuedforthissynchronizationmode,onlycertaincompileroptimizationsareaffected...首先,x86遵循严格的内存排序是真的吗?总是强加这一点似乎效率很低。意味着每次写入和读取都有一个

c++ - C++中的原子指针和线程间传递对象

我的问题涉及std::atomic以及这个指针指向的数据。如果在线程1中我有ObjectA;std:atomicptr;intbar=2;A.foo=4;//fooisanint;ptr.store(*A);如果在线程2中我观察到ptr指向A,我能保证ptr->foo是4和bar是2吗?原子指针的默认内存模型(顺序一致)是否保证在原子存储之前发生的非原子(在本例中为A.foo)上的分配将在其他线程看到分配之前被其他线程看到同样atomic.store对于这两种情况?如果有帮助或重要,我正在使用x64(我只关心这个平台)、gcc(具有支持原子的版本)。 最佳答

c++ - 大量文件的原子删除

我正在尝试一次性删除10000多个文件,例如要么全部都需要立即删除,要么都需要留在原地。当然,显而易见的答案是将所有文件移动到一个临时目录,并在成功时递归删除它,但这会使所需的I/O量加倍。压缩不起作用,因为1)我不知道需要删除哪些文件,以及2)文件需要经常编辑。有什么可以帮助降低I/O成本的方法吗?任何平台都可以。编辑:我们假设随时可能发生停电。 最佳答案 Kibbee是正确的:您正在寻找交易。但是,如果您不想,则不必依赖数据库或特殊的文件系统功能。交易的本质是这样的:将一条记录写入一个特殊文件(通常称为“日志”),列出您要删除的

c++ - 标准::原子 | compare_exchange_weak 与 compare_exchange_strong

我不确定是我不理解还是文档没有明确制定。以下摘自最新草案(N3126,第29.6节):boolatomic_compare_exchange_weak(volatileA*object,C*expected,Cdesired);boolatomic_compare_exchange_weak(A*object,C*expected,Cdesired);boolatomic_compare_exchange_strong(volatileA*object,C*expected,Cdesired);boolatomic_compare_exchange_strong(A*object,C*