草庐IT

atomic_thread_fence

全部标签

c++ - 什么时候调用 std::thread 析构函数?

我知道std::thread析构函数在主退出时调用,或者当线程对象超出范围时调用。但是当它调用的函数执行完毕时它是否也被销毁了?如果不是这样的线程会发生什么,我还能join()它吗? 最佳答案 Butisitalsodestroyedwhenafunctionthatitiscallingisdoneexecuting?Ifnotwhathappenstosuchathread,canIstilljoin()it?不,它没有被销毁,但标记为joinable().所以是的,您仍然可以join()它。否则从你的问题的标题(“什么时候调用

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++ - OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?

有几种方法可以实现多线程。std::thread最终由C++11标准引入,但可以有效地使用boost::thread。每种技术都有特定的语法和内容,但大致用于CPU并行编程。但它们有不同的作用。我知道,例如,MPI和OpenMP用于不同的内存模型。我还知道,技术的选择实际上并不是唯一的,因此可以使用另一种技术(同样是MPI和OpenMP)。为什么它们用于不同的效果但仍然使用相同的源(CPU)?如果我基于这些技术中的每一种技术编译具有并行性的C++程序,会有什么区别(从操作系统和硬件的角度来看)?例如,OpenMP或std::thread使用POSIX线程吗?如果是这样,C++11的线程

C++ 局部变量和线程(非 thread_local)

局部数组和线程交互的C++98和C++11内存模型是什么?我不是指的是C++11thread_local关键字,它与全局变量和静态变量有关。相反,我想找出在编译时分配的数组线程的保证行为是什么。我所说的编译时指的是“intarray[100]”,这与使用new[]关键字进行分配不同。我不是指静态变量。例如,假设我有以下结构/类:structxyz{intarray[100];};和以下函数:voidfn(intx){xyzdog;for(inti=0;i从多个线程调用fn()安全吗?看起来C++的内存模型是:所有局部非静态变量和数组都分配在栈上,每个线程都有自己的栈。这是真的吗(即,这

c++ - 'std::thread::thread': 没有重载函数需要 7 个参数

我正在使用visualstudio2012和上面的错误弹出窗口。我的代码是正确的,但似乎编译器仅限于7个参数。如果我想传递7个参数,我该怎么办?我可以传递一个结构,但如果可能的话最好不要更改我的代码。 最佳答案 VS2012不完全支持可变参数模板。另请参阅此博文:http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx您可以通过定义此宏_VARIADIC_MAX将参数的最大数量设置为10。所以只需执行类似#define_VARIADIC_MAX10的操作即可。对于

c++ - boost .asio : can I do async_read and async_write simultaneously from one thread?

我读到不建议对来自不同线程的套接字进行多项操作。但是,如果我从同一个线程socket.async_read和下一个socket.async_write调用(不等待前一个完成)怎么办?当其中一个操作完成时,我可以期望正确的回调会运行吗? 最佳答案 我发现是的,您可以在同一个套接字上有一个挂起的async_read和一个挂起的async_write而不会出现问题。当您调用io_service::run()方法时,回调将按预期完成。在同一个套接字上发出多个async_reads,或在同一个套接字上发出多个async_writes,可能会导

C++ std::thread 成员函数

我正在尝试编写一个命令行服务器,该服务器将从串行端口接收信息、解析信息并将其记录在内部对象中。然后根据客户端的请求,服务器将返回请求的信息。我想做的是将接收器和解析器部分放在一个单独的线程中,以便让服务器同时运行,而不干扰数据收集。#include#includeclassexampleClass{std::thread*processThread;publicvoidcompleteProcess(){while(1){processStep1();if(verification()){processStep2()}}};voidprocessStep1(){...};voidpro

c++ - C++ 中的内存模型 : sequential consistency and atomicity

我对C++11中的内存模型有一些疑问。关于https://www.think-cell.com/en/career/talks/pdf/think-cell_talk_memorymodel.pdf29.幻灯片上写着TheC++memorymodelguaranteessequentialconsistency但是,在我之前的帖子中,我了解到C++内存具有弱内存模型-编译器可以根据需要进行重新排序-他必须满足asif规则。 最佳答案 C++内存模型可以保证顺序一致性如果您使用具有适当内存顺序的原子操作来保证顺序一致性。如果您只是使用

c++ - 添加 #include <boost/thread/mutex.hpp> 会破坏我的 ActiveX 控件吗?

在ActiveX控件中使用boost::mutexheader是否存在已知问题?(boost版v1.39)如果我在VisualStudio2008中创建一个名为“DefaultOCXControl”的MFCActiveX控件项目,那么我可以构建它,该控件将自身注册为构建的一部分,并且可以像您期望的那样插入到ActiveX测试容器中。一切顺利。如果我再添加这一行:#include在我的DefaultOCXControlCtrl.h文件顶部并重建:构建结束时的注册步骤失败并显示:DebugAssertionFailed!Program:C:\Windows\system32\regsvr3