草庐IT

atomic-swap

全部标签

c++ - 为什么 swap 在 C++ 中不使用 Xor 操作

我了解到异或运算可以用来实现有效的交换功能。像这样:templatevoidswap(T&a,T&b){a=a^b;b=a^b;a=a^b;}但是我在网上能找到的swap实现基本上是这样的:templatevoidswap(T&a,T&b){Ttemp(a);a=b;b=temp;}编译器似乎没有为上面的两种形式生成相同的代码,因为我在VC++2010上对其进行了测试,第一个比std::swap更快地完成了工作。第一个有便携性或任何其他问题吗?请随时纠正我的任何错误,因为我不是英语母语,也不擅长C++。(编者注:测试可能是使用未优化的调试版本完成的,而不是std::swap可以内联的发

c++ - 为什么标准库不以无锁方式为 8 字节以下的结构实现 std::atomic?

假设架构可以以无锁方式支持std::atomic的8字节标量。为什么标准库不为小于8字节的结构提供类似的特化?这种std::atomic特化的简单实现可以将结构序列化/反序列化(使用std::memcpy)到等效的std::uintx_t中x是结构的宽度(以位为单位)(四舍五入到最接近的大于或等于结构宽度的2的幂)。这将被很好地定义,因为std::atomic要求这些结构可以简单地复制。例如。https://godbolt.org/z/sxSeId,这里的Something只有3个字节,但是实现调用了__atomic_load和__atomic_exchange,两者都使用了锁表。

c++ - 为什么 std::atomic_is_lock_free 不是静态 constexpr?

我很困惑。实现怎么可能只在运行时知道类型是否是原子的? 最佳答案 编译器可能不知道代码将在哪个CPU上运行,并且CPU的无锁能力可能不同。例如,CPU可能不支持对long类型的原子操作(因此可能需要锁),但如果系统只有一个内核,它们可能会自动成为原子操作,因为它们不能被中断并且没有其他核心可以与之竞争(因此不需要任何特殊的东西并且类型是无锁的)。 关于c++-为什么std::atomic_is_lock_free不是静态constexpr?,我们在StackOverflow上找到一个类似

c++ - 为什么在分配器中允许 `propagate_on_container_swap == false`,因为它可能导致未定义的行为?

注意:最初由MattMcnabb提问作为comment在WhycanswappingstandardlibrarycontainersbeproblematicinC++11(involvingallocators)?.标准(N3797)说如果progagate_on_container_swapAllocator内部是std::false_type如果所涉及的两个分配器比较不相等,它将产生未定义的行为。为什么标准会允许这样的构造,因为它看起来非常危险?23.2.1p9GeneralContainerRequirements[container.requirements.general

c++ - 如何优雅地初始化 std::atomic 数组?

假设我有一个包含std::atomic成员数组的类,其中数组的大小是通过计算确定的(即它可能会根据程序中其他地方的其他常量而改变):classFoo{staticconstexprsize_tkArraySize=ComputeArraySize();std::atomicatomics_[kArraySize];};什么是最优雅的方式来确保原子都被初始化为零?我能比在Foo的构造函数中遍历数组更好吗?显式存储零?std::array的答案是否不同?通常我会在这里使用大括号初始值设定项,但是导出的长度(可能很长)使它变得困难。请注意,我不能假设Foo的实例具有静态存储持续时间。

c++ - 使用 std::atomic 和 std::condition_variable 同步不可靠

在用C++11编写的分布式作业系统中,我使用以下结构实现了一个栅栏(即工作线程池外的线程可能会要求阻塞,直到所有当前计划的作业完成):structfence{std::atomiccounter;std::mutexresume_mutex;std::condition_variableresume;fence(size_tnum_threads):counter(num_threads){}};实现围栏的代码如下所示:voidtask_pool::fence_impl(void*arg){autof=(fence*)arg;if(--f->counter==0)//(1)//weha

c++ - std::swap 是否仍会通过在 C++0x 中包含算法来定义?

swap功能模板已从移出至在C++0x中。前者在C++0x中包含后者吗?或者它们是否都包含一个共同的header定义swap?换句话说,下面的代码是否保证可以在C++0x中编译?#include//willthispullinstd::swap?//...usingstd::swap;swap(a,b); 最佳答案 FDIS(n3290),在附件C,“兼容性”,C.2.7中说:17.6.3.2Effectonoriginalfeature:FunctionswapmovedtoadifferentheaderRationale:Remo

c++ - 带有状态分配器的 std::vector::swap() 是否应该使所有迭代器失效?

给定分配器a1和a2,其中a1!=a2,和std::vectorv1(a1)和v2(a2)然后v1.swap(v2)使所有迭代器无效。这是预期的行为吗? 最佳答案 一般来说,swap从不使迭代器无效。然而,当分配器不同时,另一条规则开始发挥作用。在这种情况下,行为取决于allocator_traits::propagate_on_container_swap::value和allocator_traits::propagate_on_container_swap::value.如果两者都为真,则分配器与数据一起交换,所有迭代器仍然有

python - 在 Atom 代码编辑器中运行代码

我已经阅读了很多关于在Atom代码编辑器中运行代码的文章,但是,我似乎无法理解如何做到这一点。谁能用更简单的术语解释一下?我想在其中运行我的Python代码,我已经从Atom网站下载了“python-tools-0.6.5”和“atom-script-2.29.0”文件,我只需要知道如何获取他们在工作。 最佳答案 从Atom>首选项>安装:搜索atom-runner包并安装它。在Atom上安装包atom-runner之后;创建一个新文档并将您的代码复制并粘贴到新文档中,并以.py扩展名保存该文档。例如myfile.py最后一步使用此

c++ - 在 Windows 中等待 std::atomic<int> 的正确方法?

下面的代码可以工作,但是有一个问题:#include#include"windows.h"std::atomicfoo;DWORDWINAPIbaz(void*){Sleep(10000);foo.store(1);return0;}intmain(){foo.store(0);HANDLEh=CreateThread(NULL,0,baz,NULL,0,NULL);while(!foo.load()){Sleep(0);}WaitForSingleObject(h,INFINITE);CloseHandle(h);return0;}程序在等待时使用了最大的CPU。如果我改变Sleep