草庐IT

c++ - 指针写入不是原子的最常见配置是什么?

我对多线程很感兴趣。该领域有很多陷阱,例如,不能保证指针写入是原子的。我明白了,但想知道在实际情况下最流行的当前配置是什么?例如,在我的MacbookPro/gcc上,指针写入看起来绝对是原子的。 最佳答案 这主要是指针宽度大于CPU架构宽度的CPU架构的问题。例如,在ATmega上CPU,8位架构,地址空间是16位。如果没有任何特定指令来加载和存储16位地址,则至少需要两条指令来加载/存储指针值。 关于c++-指针写入不是原子的最常见配置是什么?,我们在StackOverflow上找到

C++ - 如何初始化原子数组?

arrayA;atomic_init(A,{0})和A={ATOMIC_VAR_INIT(0)}似乎都不起作用,返回了一个难以理解的错误。如何将原子数组初始化为0?即使for循环在每一步都更新数组的一个元素也是行不通的。如果我们无法初始化原子数组,它们的用途是什么?我还想补充一点,我的数组的实际大小很大(不是示例中的10),所以我需要直接初始化。 最佳答案 std::array,100>A;for(auto&x:A)std::atomic_init(&x,std::size_t(0));做这个工作使用clang++-std=c++1

c++ - 线程安全设置

我正在编写一些可以在我的多线程应用程序中随处访问的设置类。我会经常读取这些设置(因此读取访问应该很快),但不会经常写入它们。对于原始数据类型,它看起来像boost::atomic提供我需要的东西,所以我想到了这样的东西:classUInt16Setting{private:boost::atomic_Value;public:uint16_tgetValue()const{return_Value.load(boost::memory_order_relaxed);}voidsetValue(uint16_tvalue){_Value.store(value,boost::memory

c++ - 与 std::condition_variable 相比,使用 std::atomic 的方法 wrt 在 C++ 中暂停和恢复 std::thread

这是一个单独的问题,但与我之前提出的问题有关here我正在使用std::thread在我的C++不断轮询某些数据并将其添加到缓冲区的代码。我用C++lambda像这样启动线程:StartMyThread(){thread_running=true;the_thread=std::thread{[this]{while(thread_running){GetData();}}};}thread_running是一个atomic在类头中声明。这是我的GetData功能:GetData(){//Someheavylogic}接下来我还有一个StopMyThread我设置的功能thread_r

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

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

c++ - 为什么自由函数和成员函数都存在用于比较和交换操作?

C++标准库同时具有freefunctions和memberfunctions用于原子比较和交换操作。如freefunctions所述:Thesefunctionsaredefinedintermsofmemberfunctionsofstd::atomic:obj->compare_exchange_weak(*expected,desired)obj->compare_exchange_strong(*expected,desired)obj->compare_exchange_weak(*expected,desired,succ,fail)obj->compare_exchan

c++ - 共享指针析构函数中的内存顺序

我正在尝试为共享指针析构函数找出最宽松(和正确)的内存顺序。目前我的想法如下:~shared_ptr(){if(p){if(p->cnt.fetch_sub(1,std::memory_order_release)==1){p->cnt.load(std::memory_order_acquire);deletep;}}}基本上,我认为所有以前的fetch_sub()应该发生在deletep;之前,并且由p->cnt.load(std::memory_order_acquire);,我构建了一个释放序列来确保这一点。我是C++内存模型的新手,不太自信。我上面的推理是否正确,我指定的内存

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++ - 相互竞争的原子操作会互相饿死吗?

想象一个有两个线程的程序。他们正在运行以下代码(CAS指的是CompareandSwap)://Visibletoboththreadsstaticinttest;//RunbythreadAvoidfoo(){//Checkifvalueis'test'andswapin0xdeadbeefwhile(!CAS(&test,test,0xdeadbeef)){}}//RunbythreadBvoidbar(){while(1){//Perpetuallyatomicallywriterand()intothetestvariableatomic_write(&test,rand())