草庐IT

C++ 原子和跨线程可见性

AFAIKC++原子()系列提供3个好处:原始指令不可分割性(无脏读),内存排序(CPU和编译器)和跨线程可见性/更改传播。我不确定第三个项目符号,因此请看下面的示例。#includestd::atomic_boola_flag=ATOMIC_VAR_INIT(false);structData{intx;longlongy;charconst*z;}data;voidthread0(){//dueto"release"thedatawillbewrittentomemory//exactlyinthefollowingorder:x->y->zdata.x=1;data.y=100;

c++ - 可调用项,转发,右值和线程

如何转发可能是右值及其(可变)参数的可调用对象,以使执行对于待生成的线程而言100%正确且可靠?我的猜测是答案将是“等待条件变量”,但我想确定。我为什么要问这个?我有一个Homebrewn线程实现,在std::thread出现之前很久就可以100%可靠地工作了。它仍然可以正常工作。现在我们确实有了std::thread了一段时间(或多或少,这就是说……由于依赖于gthr/pthread,MinGW类型的发行版对线程的支持不是那么好,可悲的是,我绝对需要支持Win32)。std::thread具有这个很酷的功能,您可以传递一个lambda以及任意参数,并且它以某种方式起作用。棒极了。我的

c++ - Thread C++ 成员函数模板可变参数模板

我尝试使用线程调用对象的成员函数。如果函数没有可变参数模板(Args...args),没问题,它可以工作:考虑这两个类:基因引擎templateclassGeneticEngine{templateT*run_while(bool(*f)(constT&),constintsize_enf,Args&...args){std::thread(&GeneticThread::func,islands[0],f,size_enf);/*Somecode*/return/*...*/}private:GeneticThread**islands;}遗传线程templateclassGenet

c++ - 在 C++ 中自动绑定(bind) boost::thread?

做的时候:std::vectorvec;intnumber=4;boost::threadworkerThread(&Method,number,vec)givenamethod:templatevoidMethod(intn,std::vector&vec){//doesstuff}为什么我必须手动做:boost::threadworkerThread(&Method,number,boost::ref(vec))?为什么它不通过引用自动传递它?Edit::理论上boost::thread是否有可能做一些宏元编程来调整它,因为C++没有内置反射/内省(introspection)的方

c++ - G++ 4.6 -std=gnu++0x : Static Local Variable Constructor Call Timing and Thread Safety

voida(){...}voidb(){...}structX{X(){b();}};voidf(){a();staticXx;...}假设在进入main之后,f被多个线程(可能竞争)多次调用。(当然,唯一对a和b的调用是上面看到的那些)以上代码在-std=gnu++0x模式下用gccg++4.6编译时:Q1。是否保证至少调用一次a()并在调用b()之前返回?也就是说,在第一次调用f()时,x的构造函数是否会同时调用一个自动持续时间局部变量(非静态)(而不是在全局静态初始化时间)?Q2。是否保证b()只会被调用一次?即使两个线程第一次同时在不同的核上执行f?如果是,GCC生成的代码通过

c++ - 在 Windows 上创建并行离屏 OpenGL 上下文

我正在尝试设置并行多GPU离屏渲染上下文。我使用“OpenGLInsights”一书第27章“NVIDIAQuadro上的多GPU渲染”。我还研究了wglCreateAffinityDCNVdocs但仍然无法确定。我的机器有2个NVidiaQuadro4000卡(无SLI)。在Windows764位上运行。我的工作流程是这样的:使用GLFW创建默认窗口上下文。映射GPU设备。销毁默认的GLFW上下文。为每个设备创建新的GL上下文(目前只尝试一个)为每个上下文设置boost线程并使其在该线程中处于当前状态。分别在每个线程上运行渲染程序。(不共享资源)一切都是在没有错误的情况下创建和运行的

c++ - Valgrind 报告 "brk segment overflow in thread #1"

这个问题在这里已经有了答案:Valgrindreportingasegmentoverflow(5个答案)关闭5年前。我想知道这条消息意味着什么:==18151==brksegmentoverflowinthread#1:can'tgrowto0x4a26000请注意,代码运行良好并且输出正确。我应该忽略这条消息吗?这是什么意思?

RT-Thread 软件包-软件包分类-IoT-WebNet①

RT-Thread软件包-软件包分类-IoT-WebNet①RT-Thread软件包-软件包分类-IoT-WebNet①WebNet1、介绍1.1目录结构1.2许可证1.3依赖2、获取软件包3、使用WebNet软件包4、注意事项示例程序准备工作软件包获取页面文件准备启动例程AUTH基本认证例程CGI事件处理例程ASP变量替换例程SSI文件嵌套例程INDEX目录显示例程ALIAS别名访问例程Upload文件上传例程示例代码维护人:RT-Thread软件包-软件包分类-IoT-WebNet①WebNet中文页|English1、介绍WebNet软件包是RT-Thread自主研发的,基于HTTP协议

c++ - 使用 std::atomic::compare_exchange_strong 时,对 std::atomic 的写入是否会被其他线程看不到?

std::atomicg_atomic;voidthread0(){intoldVal=0;intnewVal=1;while(g_atomic.compare_exchange_strong(oldVal,newVal,std::memory_order_acq_rel,std::memory_order_acquire)){//forevercountingfrom0to100untilunexpectedvalueappearsoldVal=newVal;newVal=(oldVal+1)%100;};}voidthread1(){//setunexpectedvalueg_at

c++ - 乱序执行的获取-释放对

我在考虑原子变量是否可以加载获取-释放对中的旧值。假设我们有原子变量x,我们用释放语义存储该变量,然后用获取语义加载它,理论上是否可以读取旧值?std::atomicx=0;voidthread_1(){x.store(1,std::memory_order_release);}voidthread_2(){assert(x.load(std::memory_order_acquire)!=0);}如果函数线程1在线程2加载x时完成(因此存储了新值),线程2是否可以从x加载旧值?换句话说,如果对x的实际存储在加载之前完成,断言是否有可能触发?据我从网上的文章中了解到这是可能的,但我不明