草庐IT

atom_count

全部标签

C++11:atomic<T>::store 和 atomic_store<T> 之间有什么区别

一个是模板类std::atomic的成员函数,一个是模板函数,看起来他们做的是同一件事。既然std是一个类库,为什么它同时提供类和非类版本,我认为是一样的操作?它们之间有什么真正的区别吗? 最佳答案 语义上没有区别。免费功能是为了实现与C11的源代码兼容性的尝试:#ifdef__cplusplus#include#define_Atomic(X)std::atomic#else#include#endif_Atomic(int)c;intget_c(void){returnatomic_load(&c);}

c++ - C++ 11 中使用 Atomic 的连续、不同的序列

我有两个关于原子的问题:1)以下代码是否保证在多线程设置中返回连续的、单调递增的序列而不重复?#includestructAtomicCounter{std::atomicvalue;AtomicCounter():value(0){}intgetNextSequence(){return++value;}};2)有没有更简单的初始化方法?这些都不起作用:std::atomicvalue(0);std::atomicvalue{0};std::atomicvalue=0;提前致谢 最佳答案 是的,您将获得一个没有间隙或重复的序列,即

c++ - std::atomic 如何保证原子性

如果我有密码a=a+1,现在我明白执行此操作需要多个CPU级别的操作,但是如何定义a作为std::atomic使这些多个事务成为原子?它是否改变了CPU指令的执行方式。我假设它必须以某种方式将指令数减少到1,这样任何上下文切换都不会导致不可靠的结果,但它是如何做到的呢?如果编译器总是可以创建这样的代码,为什么不总是这样做呢? 最佳答案 如果有原子指令可以发出(对于已知可能的原子操作),则发出这条原子指令,否则会带锁机制。有一个函数(C++17)可以告诉您原子类型是否始终是无锁的:is_always_lock_free.请注意,如果此

c++ - 如果 `atomic<T>` 是无锁的并且大小与 `T` 相同,内存布局是否相同?

Thisquestionhere表示std::atomic通常应该与T具有相同的大小,而对于x86、x64和ARM上的gcc、clang和msvc,情况确实如此。在std::atomic的实现中对于某些类型总是无锁T,它的内存布局是否保证与T的内存布局相同??std::atomic是否有任何额外的特殊要求?,比如对齐? 最佳答案 在查看[atomics.types.generic]时,您链接的答案部分引用了该答案,关于对齐的唯一评论是您之前看到的注释:Note:Therepresentationofanatomicspecializ

c++ - atomic<T*> 总是无锁的吗?

在我的MAC操作系统上,atomic是无锁的。#include#includeintmain(){std::cout().is_lock_free()我想知道是否atomic总是无锁?有引用介绍吗? 最佳答案 Thestandardallowsimplementinganyatomictype(withexceptionofstd::atomic_flag)tobeimplementedwithlocks.即使平台允许某些类型的无锁原子,标准库开发人员也可能没有实现它。如果您需要在使用锁时实现不同的东西,可以在编译时使用ATOMIC

c++ - boost shared_ptr use_count 函数

我的申请问题如下-我有一个大结构foo。因为它们很大并且出于内存管理的原因,我们不希望在数据处理完成后删除它们。我们将它们存储在std::vector>.中我的问题与了解所有处理何时完成有关。第一个决定是我们不希望任何其他应用程序代码在结构中标记一个完整的标志,因为程序中有多个执行路径,我们无法预测哪一个是最后一个。因此在我们的实现中,一旦处理完成,我们将删除boost::shared_ptr>的所有拷贝除了vector中的那个。这会将shared_ptr中的引用计数器降为1。使用shared_ptr.use_count()查看它是否等于1以了解我的应用程序的所有其他部分何时处理完数据

c++ - 使用已删除函数 - std::atomic

这是我在.h文件中的声明:staticstd::atomicOrdersExecutorIdCounter;这是来自.cpp文件的初始化:std::atomicActionBasedOrdersExecutor::OrdersExecutorIdCounter=0;它在VC++中编译得很好,但在gcc4.8中我得到这个错误:error:useofdeletedfunction‘std::atomic::atomic(conststd::atomic&)’我该如何解决这个问题? 最佳答案 可以直接初始化原子变量,不需要deleted拷

c++ - 对 std::atomic::load 的结果使用 Structure dereference(->) 运算符是否安全

在尝试使用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。我认为它们是非法的,因为在执行读取操作时指针可能会被引用。

c++ - 共享指针不增加 use_count

我正在尝试了解如何在C++中使用std::shared_ptr。但这很令人困惑,我不明白如何创建指向同一对象的多个共享指针。甚至文档和在线资料也不是很清楚。以下是我编写的一小段代码,用于尝试理解std::shared_ptr的行为:#include#includeusingnamespacestd;classNode{public:intkey;Node(){key=0;}Node(intk){key=k;}};intmain(){Nodenode=Node(10);shared_ptrptr1((shared_ptr)&node);coutptr2=make_shared(node)

c++ - std::atomic_store 和 std::atomic_exchange 不交换

根据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