草庐IT

atomic-values

全部标签

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++ - 在#ifndef 中包装#includes - 增加任何值(value)?

我继承了C/C++代码库,在许多.cpp文件中,#include指令被包装在#ifndef中,header内部单个包含#define。例如#ifndef_INC_WINDOWS#include#endif和windows.h看起来像#ifndef_INC_WINDOWS#define_INC_WINDOWS...headerfilestuff....#endif//_INC_WINDOWS我假设这样做是为了加快代码的编译/预处理。我认为这是一个丑陋的过早优化,但由于该项目从清理开始有5分钟的构建时间,我不想让事情变得更糟。那么这种做法是否会增加任何值(value)或加快速度?清理它们可

c++ - 警告 : second/third operand of conditional has no effect [-Wunused-value]

std::cout我想检查给定值是否可以创建三角形。我收到警告:secondoperandofconditionalexpressionhasnoeffect[-Wunused-value]thirdoperandofconditionalexpressionhasnoeffect[-Wunused-value]怎么了? 最佳答案 您的代码转换为:((std::cout首先,operator有更高的operatorprecedence比operator&&.只有abs(b-c)的值将被打印并且(a部分将与std::ostream::

c++ - 为什么 std::map 没有 insert(key &, value & v) 类型的插入函数

为什么std::map不支持如下插入:std::mapmap_int;voidinsert_map(obj1&key,obj2&val){map_int.insert(key,val);}我知道以上是不正确的。我想知道是什么阻止了这样设计插入功能。它比创建一对IMO更直观。 最佳答案 它叫做emplace():std::mapm;//usespair'stemplateconstructorm.emplace("d","ddd"); 关于c++-为什么std::map没有insert(k

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

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

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++ "value++"会导致警告但 "value+1"不会?

这个问题在这里已经有了答案:Undefinedbehaviorandsequencepoints(5个答案)关闭3年前。代码:inta=0;a=++a%5;引起警告:warning:operationon'a'maybeundefined[-Wsequence-point]a=++a%5;~~^~~~~~~~~用-Wall编译时用各种编译器比如gcc然而这段代码,工作正常吗?inta=0;a=(a+1)%5;为什么这是一个警告,可以安全地忽略它吗?将其包裹在方括号中似乎并不能使警告消失。编辑:为澄清起见,我在看到这些警告消息时使用的是C++17编译器。

c++ - 警告 : value computed is not used

为什么我在“BIO_flush(b64);”行收到警告消息“警告:未使用计算值”我怎样才能摆脱它?unsignedchar*my_base64(unsignedchar*input,intlength){BIO*bmem,*b64;BUF_MEM*bptr;b64=BIO_new(BIO_f_base64());bmem=BIO_new(BIO_s_mem());b64=BIO_push(b64,bmem);BIO_write(b64,input,length);BIO_flush(b64);BIO_get_mem_ptr(b64,&bptr);unsignedchar*buff=(u