jjzjj

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())

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可用于告诉编译器不要优化对变量使用的内存的重复访问。显然,如果另一个线程可以更新变量,您将需要它。它被称为“几乎无用”的原因是,在太多情况下,这不足以保证正确的多线程行为,您需要查看内存栅栏和原子原语操作。在某些处理器