草庐IT

atomic_flag

全部标签

c++ - 与 `std::mutex` 同步是否比与 `std::atomic(memory_order_seq_cst)` 慢?

在互斥体上使用原子的主要原因是互斥体很昂贵,但是atomics的默认内存模型是memory_order_seq_cst,这不是一样昂贵吗?问题:使用锁的并发程序能否与并发无锁程序一样快?如果是这样,除非我想将memory_order_acq_rel用于原子,否则可能不值得付出努力。编辑:我可能遗漏了一些东西,但基于锁的不能比无锁更快,因为每个锁也必须是一个完整的内存屏障。但是对于无锁,可以使用比内存屏障限制更少的技术。回到我的问题,无锁是否比基于新C++11标准和默认memory_model的锁更快?“以性能衡量时,无锁>=基于锁”是真的吗?假设有2个硬件线程。编辑2:我的问题不是关于

C++ atomic_flag 查询状态

我正在使用C++std::atomic_flag作为一个原子bool标志。将标志设置为真或假不是问题,但是如何在不将其设置为某个值的情况下查询标志的当前状态?我知道有方法'atomic_flag_clear'和'atomic_flag_set'。它们确实会返回以前的状态,但也会修改当前状态。有什么方法可以查询标志状态而不修改它还是我必须使用完整的'std::atomic'。 最佳答案 您无法读取std::atomic_flag的值不将其设置为true.这是设计使然。它不是一个bool变量(我们有std::atomic),而是一个保证

c++ - 仅编译器的内存屏障(例如 std::atomic_signal_fence)何时有用?

编译器栅栏的概念经常在我阅读有关内存模型、障碍、排序、原子等方面的内容时出现,但通常它也是在的上下文中正如人们所期望的那样,em>与CPU围栏配对。不过,我偶尔会读到仅适用于编译器的栅栏结构。这方面的一个例子是C++11std::atomic_signal_fence函数,它声明为cppreference.com:std::atomic_signal_fenceisequivalenttostd::atomic_thread_fence,exceptnoCPUinstructionsformemoryorderingareissued.Onlyreorderingoftheinstru

c++ - 为什么 std::atomic<bool> 比 volatile bool 慢得多?

多年来我一直在使用volatilebool进行线程执行控制,效果很好//inmyclassdeclarationvolatileboolstop_;-----------------//Inthethreadfunctionwhile(!stop_){do_things();}现在,由于C++11增加了对原子操作的支持,我决定尝试一下//inmyclassdeclarationstd::atomicstop_;-----------------//Inthethreadfunctionwhile(!stop_){do_things();}但它比volatilebool慢几个数量级!我编

c++ - 如何有效地将 std::atomic<> 用于非原始类型?

Thedefinitionsforstd::atomic似乎对原始类型或POD类型显示出明显的用处。你什么时候会用它来上课?什么时候应该避免在类里面使用它? 最佳答案 操作std::atomic在任何可简单复制的类型上可用是非常基本的。你可以build和摧毁atomic,你可以询问类型is_lock_free(),您可以加载和存储T的拷贝,您可以交换T的值以各种方式。如果这足以满足您的目的,那么您最好这样做而不是持有显式锁定。如果这些操作还不够,例如,如果您需要直接对值自动执行序列操作,或者如果对象足够大以至于复制成本很高,那么您可

c++ - CMake 中的 set_target_properties 是否覆盖 CMAKE_CXX_FLAGS?

在我的CMake项目开始时,我在变量CMAKE_CXX_FLAGS中设置通用编译标志,例如set(CMAKE_CXX_FLAGS"-W-Wall${CMAKE_CXX_FLAGS}")稍后,我需要附加其他特定于配置的编译标志(存储在BUILD_FLAGS中)。我可以为此使用以下命令吗:set_target_properties(${TARGET}PROPERTIESCOMPILE_FLAGS${BUILD_FLAGS})还是我必须手动添加CMAKE_CXX_FLAGS:set_target_properties(${TARGET}PROPERTIESCOMPILE_FLAGS"${CM

c++,std::atomic,什么是 std::memory_order 以及如何使用它们?

谁能解释一下std::memory_order是什么?用简单的英语,以及如何将它们与std::atomic一起使用?我在这里找到了引用资料和几个例子,但根本不明白。http://en.cppreference.com/w/cpp/atomic/memory_order 最佳答案 std::memory_order值允许您对原子操作提供的内存排序指定细粒度约束。如果您正在从多个线程修改和访问原子变量,那么将std::memory_order值传递给您的操作允许您放松编译器和处理器上关于对这些原子变量的操作对其他线程可见的顺序,以及这些

go - Atom Editor 1.15.0 with Go-Plus 在函数源代码中有红色背景

我已将Atom更新到最新版本(1.15.0)并更新了所有插件。我有go-plus和go-debug插件。Go文件中的大量方法随机出现红色背景。如果我保存文件,它会消失几秒钟。我认为这是一些警告,但我在go-plus中没有看到警告。任何想法..redbg是什么意思以及如何禁用它? 最佳答案 如果一个包没有测试文件,Atom将显示所有源代码行的默认背景。如果一个包至少有1个测试文件,默认情况下会在每次保存时运行测试。运行测试时,行以默认背景显示,当测试完成时,可以测试但未被测试覆盖的代码行将以红色背景显示。您可以在设置中更改此设置:Vi

Golang Flag 被解释为第一个 os.Args 参数

我想像这样运行我的程序:gorunlaunch.gohttp://example.com--m=2--strat=par"http://example.com"被解释为第一个命令行参数,这没问题,但此后不解析标志并保持默认值。如果我这样说:gorunlaunch.go--m=2--strat=parhttp://example.com然后"--m=2"被解释为第一个参数(应该是URL)。我也可以完全删除os.Args,但是我将只有可选标志,并且我希望一个(URL)是强制性的。这是我的代码:packagemainimport("fmt""webcrawler/crawler""webcr

去测试标志: flag provided but not defined

您好,我在go中测试时使用了一个标志:file_test.govarip=flag.String("ip","noip","test")我只在一个测试文件中使用它。仅测试一个测试文件时它工作正常,但是当我运行时:gotest./...-ip127.0.0.1alleoftheothertestfilesay:flagprovidedbutnotdefined.你见过吗?问候 最佳答案 flag.Parse()在你的标志被定义之前被调用。您必须确保所有标志定义发生在调用flag.Parse()之前,通常通过在init()函数中定义所有