草庐IT

atomic-swap

全部标签

c++ - 为什么我的 swap<string,string> 比 std 版本慢得多?

这是我的C++代码:inlinestaticvoidswap(std::string&a1,std::string&a2){std::stringtemp(std::move(a1));a1=std::move(a2);a2=std::move(temp);}我运行此函数1000000次,平均耗时78毫秒,但std仅耗时13毫秒。刚刚看了下std::swap的实现,和我的差不多,为什么我的这么慢? 最佳答案 根据标准§21.3.2.8/p1swap[string.special](EmphasisMine):templatevoid

c++ - 我可以在 C++ 中仅使用 std::atomic 而不使用 std::mutex 安全地跨线程共享变量吗?

我制作了一个在多核上计算素数的程序。(请忽略该算法并非完全有效,这里将数字0和1视为质数。目的只是练习使用线程。)变量taken(接下来要测试的数字)正在8个线程之间共享。问题是它可以由一个线程递增,紧接着由另一个线程递增,并在它已经递增两次(或更多次)时被它们读取,因此可以跳过一些值,这是一件坏事。我以为它可以通过使用std::atomic_uint作为变量类型来解决,但我显然错了。有什么方法可以在不需要使用std::mutex的情况下解决这个问题,因为我听说它会导致相当大的开销?源代码:#include#include#include#include#include#include

c++ - 用于取消标志的 std::atomic_bool:std::memory_order_relaxed 是正确的内存顺序吗?

我有一个从套接字读取并生成数据的线程。每次操作后,线程都会检查一个std::atomic_bool标志以确定它是否必须提前退出。为了取消操作,我将取消标志设置为true,然后在工作线程对象上调用join()。线程和取消函数的代码如下所示:std::threadwork_thread;std::atomic_boolcancel_requested{false};voidthread_func(){while(!cancel_requested.load(std::memory_order_relaxed))process_next_element();}voidcancel(){can

c++ - 如何创建包含 std::atomic 的 std::pair?

我不知道如何创建以下内容:std::pair,int>我总是得到/usr/include/c++/5.5.0/bits/stl_pair.h:139:45:error:useofdeletedfunction'std::atomic::atomic(conststd::atomic&)':first(__x),second(std::forward(__y)){}我试过了std::pair,int>pair=std::make_pair(true,1);//doesn'tworkstd::pair,int>pair=std::make_pair({true},1);//doesn'tw

c++ - 通过 copy-and-swap 分配与两个锁

借款HowardHinnant'sexample并将其修改为使用copy-and-swap,这op=线程安全吗?structA{A()=default;A(Aconst&x);//Assumeimplementscorrectlockingandcopying.A&operator=(Ax){std::lock_guardlock_data(_mut);usingstd::swap;swap(_data,x._data);return*this;}private:mutablestd::mutex_mut;std::vector_data;};我相信这是线程安全的(记住op=的参数是按

c++ - 为什么在此 constexpr 函数中允许使用 std::swap?

我写了一个计算两个数字的gcd的函数,它使用std::swap在第二个参数大于第一个参数的情况下。一段时间后,我意识到std::swap不是constexpr,但我的函数仍然编译并成功运行。我尝试使用MinGW-w648.1.0和VisualC++2017,它对两者都有效。我的第一个想法是因为constexpr允许在运行时执行函数,所以我尝试了std::integral_constant,它奏效了。但是,我不能使用我自己的任何非constexpr函数(这是我所期望的)。这是我的测试代码:#includeinlinevoidfoo()noexcept{}templateconstexpr

c++ - 多线程程序中的 std::atomic<int> memory_order_relaxed VS volatile sig_atomic_t

volatilesig_atomic_t是否提供任何内存顺序保证?例如。如果我只需要加载/存储一个整数,可以使用吗?例如这里:volatilesig_atomic_tx=0;...voidf(){std::threadt([&]{x=1;});while(x!=1){/*waiting...*/}//done!}这是正确的代码吗?在某些情况下它可能不起作用?注意:这是一个过度简化的示例,即我不是在为给定的代码片段寻找更好的解决方案。我只想了解在根据C++标准的多线程程序中,我可以从volatilesig_atomic_t中得到什么样的行为。或者,如果是这种情况,请理解行为未定义的原因。

c++ - 我应该使用 atomic 还是 volatile 作为指针?

有两个线程(t1和t2)固定到两个不同的核心。它们都有一个共享变量,它是指向某个类类型的原始指针。t1只读指针,t2读/写指针。我应该将指针声明为volatile或atomic还是两者兼而有之?当t2更新这个指针时,t1读取旧指针或新指针都可以,但它不应该读取任何中间值,因为它会导致段错误。 最佳答案 volatile可用于告诉编译器不要优化对变量使用的内存的重复访问。显然,如果另一个线程可以更新变量,您将需要它。它被称为“几乎无用”的原因是,在太多情况下,这不足以保证正确的多线程行为,您需要查看内存栅栏和原子原语操作。在某些处理器

c++ - ‘operator=’ 的模糊重载与 c++11 std::move and copy and swap idiom

我收到以下错误:[matt~]g++-std=c++11main.cpp-DCOPY_AND_SWAP&&./a.outmain.cpp:Infunction‘intmain(int,constchar*const*)’:main.cpp:101:24:error:ambiguousoverloadfor‘operator=’in‘move=std::move((*©))’main.cpp:101:24:note:candidatesare:main.cpp:39:7:note:Test&Test::operator=(Test)main.cpp:52:7:note:Test&

c++ - 使用作用域 queue::swap 清空 std::queue 是否违反任何规则?

我有很多使用队列的情况,队列的大小可以增长到数百个。不幸的是,如果有必要,没有清空队列的一次性解决方案。我想知道是否使用作用域队列进行交换,然后让作用域队列被销毁,是否会破坏任何内存分配/管理规则?以下片段是我所提议的示例。似乎有效,如果长时间使用多次,则不确定结果。#include#include#includeintmain(){std::queuefoo;foo.push(10);foo.push(20);foo.push(30);std::coutbar;swap(foo,bar);}std::cout 最佳答案 您的代码没