草庐IT

c++ - C++ 中的无锁数据结构 = 仅使用原子和内存排序?

我曾经看到术语“无锁数据结构”并认为“哦哦哦,那一定非常复杂”。然而,我一直在阅读“C++ConcurrencyinAction”,它似乎编写了一个无锁数据结构,你所做的就是停止使用互斥锁/锁并用原子代码替换它们(以及可能的内存排序障碍)。所以我的问题是-我在这里遗漏了什么吗?由于C++11,它真的那么简单吗?写无锁数据结构只是用原子操作代替锁的情况吗? 最佳答案 噢噢噢,但这真的很复杂。如果您看不出互斥锁和原子访问之间的区别,那么您看待并行处理的方式就有问题,您编写的代码很快就会有问题。它很可能会比等效的阻塞版本运行得慢,如果您(

c++ - Fedora 22 - 编译 - __atomic_is_lock_free

我尝试在Fedora22上编译一个软件(SuperCollider),但我遇到了一个问题:libsupernova.a(server.cpp.o):Infunction`std::atomic::is_lock_free()const':/usr/include/c++/5.1.1/atomic:212:undefinedreferenceto`__atomic_is_lock_free'collect2:error:ldreturned1exitstatusserver/supernova/CMakeFiles/supernova.dir/build.make:96:recipefo

c++ - 了解 C++ 内存模型 : Different values on different runs

下面的代码有什么问题?我希望看到10由consumer1和consumer2生产,但有时我会看到-1。#include#include#include#includestd::atomicglobal;voidproducer(){global.store(10,std::memory_order_release);}voidconsumer1(){inta=global.load(std::memory_order_acquire);printf("ainconsumer1%d\n",a);}voidconsumer2(){inta=global.load(std::memory_o

c++ - 为什么存在 shared_ptr 的原子重载

为什么有shared_ptr的原子重载,如here所述而不是为处理shared_ptr的std::atomic专门化。似乎与其余C++标准库采用的面向对象模式不一致。在使用shared_ptr实现readcopyupdateidiom时,为了确保我做对了我们需要通过这些函数对共享指针进行所有访问(读取和写入)吗? 最佳答案 因为:std::atomicmaybeinstantiatedwithanyTriviallyCopyabletypeT.来源:http://en.cppreference.com/w/cpp/atomic/at

c++ - 非原子负载可以在原子获取负载之后重新排序吗?

众所周知,自C++11以来,有6个内存顺序,在有关std::memory_order_acquire的文档中:http://en.cppreference.com/w/cpp/atomic/memory_ordermemory_order_acquireAloadoperationwiththismemoryorderperformstheacquireoperationontheaffectedmemorylocation:nomemoryaccessesinthecurrentthreadcanbereorderedbeforethisload.Thisensuresthatall

c++ - 编译器是否可以优化两个原子负载?

这个问题在这里已经有了答案:Whydon'tcompilersmergeredundantstd::atomicwrites?(9个回答)CanatomicloadsbemergedintheC++memorymodel?(2个答案)关闭5年前。在这种情况下,两个负载会合二为一吗?如果这取决于体系结构,那么来自英特尔的现代处理器会是什么情况?我相信原子负载等同于英特尔处理器中的正常负载。voidrun1(){autoa=atomic_var.load(std::memory_order_relaxed);autob=atomic_var.load(std::memory_order_r

c++ - struct 专用原子类型如何实现无锁?

我找到了下面的代码,输出总是:std::atomicislockfree?falsestd::atomicislockfree?true这是代码:structA{inta[100];};structB{intx,y;};intmain(){std::coutislockfree?"{}.is_lock_free()islockfree?"{}.is_lock_free()我不明白为什么第二个结构专用原子类型是无锁的而第一个专用原子类型不能是无锁的?提前致谢。 最佳答案 http://en.cppreference.com/w/cpp

c++ - 为什么 volatile 不是 sig_atomic_t 的一部分

在我的平台(X86、Fedora、gcc9.1.1)上,sig_atomic_t类型定义为普通的int。在C++标准中,sig_atomic_t始终与volatile限定符一起使用。我明白为什么需要volatile,但为什么它不是类型的一部分呢?类似于:usingsig_atomic_t=volatileint; 最佳答案 这是从C继承的。C定义,同时允许sig_atomic_t要volatile合格,不需要它。我看过的标准文档(N1570)中使用的所有示例都以volatilesig_atomic_t的形式给出。.现在使用std:a

c++ - clang 不知道 std::atomic_bool,但 XCode 知道

我正在尝试编译声明std::atomic_bool类型变量的C++11代码。这是在带有clang的MacOS10.8.2上:clang--versionAppleclangversion4.1(tags/Apple/clang-421.11.66)(basedonLLVM3.1svn)Target:x86_64-apple-darwin12.2.0Threadmodel:posixclang提示std::atomic_bool:clang++-c-stdlib=libc++-msse4-std=c++11-Wno-unused-parameter-I.-oquery.oquery.cp

c++ - 调整原子 vector 的大小?

如何调整原子vector的大小?例如,以下代码无法编译:#include#include#includeintmain(){std::vector>v;v.resize(1000);//Problemhere!v[0]=1;return0;}错误:Infileincludedfrom/usr/local/gcc-4.8.1/include/c++/4.8.1/vector:62:0,frommain.cpp:2:/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_construct.h:Ininstantiationof‘voidstd::_