我注意到很多经典的C++引用资源已经针对C++11进行了更新,例如cplusplus.com和JosuttisStandardLibraryReference本书,似乎没有涵盖/根本没有任何关于C++11并发标准库功能的文档,例如std::thread、std::atomic和std::async。这些并发特性是否比标准库的其余部分“不那么标准”?还是由于其他原因缺少文档? 最佳答案 您引用的所有库确实是C++11标准的一部分。事实上,许多语言规则都经过重新编写以描述操作在多线程环境中的工作方式(以前,规范没有指定线程如何工作的任何
我想创建一个线程池用于实验目的(以及有趣的因素)。它应该能够处理各种各样的任务(所以我可能会在以后的项目中使用它)。在我的线程池类中,我将需要某种任务队列。由于标准库提供了std::packaged_task由于C++11标准,我的队列看起来像std::deque>task_queue,所以客户端可以推送std::packaged_tasks通过某种公共(public)接口(interface)函数进入队列(然后池中的一个线程将收到条件变量通知以执行它,等等)。我的问题与std::packaged_task的模板参数有关在双端队列中。函数签名?()应该能够处理任何类型/数量的参数,因为
在C++11及更高版本中,像这样直接将std::thread存储为类的成员时,有什么优点或缺点:std::threadmy_thread;与像这样将std::shared_ptr或std::unique_ptr存储到线程相反:std::shared_ptrmy_thread_ptr;是否有任何代码选项比其他选项更好?或者没关系,只需2种不同的方式来处理线程对象。 最佳答案 使用指针(或智能指针)成员可能有一些不太常见的原因,但对于常见用法,似乎是std::thread要么不适用,要么本身就足够灵活:我们可能希望更好地控制对象的生命周
我试图了解如何通过VisualStudio2012使用新的std::thread。我正在尝试编译以下代码。#include#includeclassscoped_thread{std::threadt_;public:explicitscoped_thread(std::thread&t):t_(std::move(t)){if(!t_.joinable())throwstd::logic_error("Nothread");}~scoped_thread(){t_.join();}private:scoped_thread(scoped_threadconst&);scoped_th
我有一个C++11程序,它配置了许多可运行的对象,将它们放在std::vector中,然后在单独的线程中启动它们。不幸的是,当我遍历vector中的对象时,我只会为最后一个对象启动线程。我在以下测试代码中提炼了问题的核心(在OSX10.9.5上使用clang6.0使用clang++-std=c++11cpp_threadlaunch.cpp编译)).#include#include#include#includestd::mutexoutputlock;classagent{public:agent(std::stringname):m_name(name){};~agent(void
这曾经工作得很好(然后外星人一定黑了我的电脑):#include#includeintmain(){std::cout现在它打印thread::idofanon-executingthread。ideone.com打印了一些ID,但有趣的是是什么导致了我平台上的这种行为。$uname-aLinuxxxx3.13.0-77-generic#121-UbuntuSMPWedJan2010:50:42UTC2016x86_64x86_64x86_64GNU/Linux有什么想法吗?编辑:嗯..当我添加std::cout两行打印相同的ID,但是当我删除它时,结果仍然相同-“非执行线程”。
这是一个单独的问题,但与我之前提出的问题有关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
我知道std::thread析构函数在主退出时调用,或者当线程对象超出范围时调用。但是当它调用的函数执行完毕时它是否也被销毁了?如果不是这样的线程会发生什么,我还能join()它吗? 最佳答案 Butisitalsodestroyedwhenafunctionthatitiscallingisdoneexecuting?Ifnotwhathappenstosuchathread,canIstilljoin()it?不,它没有被销毁,但标记为joinable().所以是的,您仍然可以join()它。否则从你的问题的标题(“什么时候调用
有几种方法可以实现多线程。std::thread最终由C++11标准引入,但可以有效地使用boost::thread。每种技术都有特定的语法和内容,但大致用于CPU并行编程。但它们有不同的作用。我知道,例如,MPI和OpenMP用于不同的内存模型。我还知道,技术的选择实际上并不是唯一的,因此可以使用另一种技术(同样是MPI和OpenMP)。为什么它们用于不同的效果但仍然使用相同的源(CPU)?如果我基于这些技术中的每一种技术编译具有并行性的C++程序,会有什么区别(从操作系统和硬件的角度来看)?例如,OpenMP或std::thread使用POSIX线程吗?如果是这样,C++11的线程
任何人都可以帮助解释这种意外行为吗?前提我创建了包含成员std::thread变量的Thread类。Thread的构造函数构造成员std::thread,提供指向调用纯虚函数(由基类实现)的静态函数的指针。代码#include#include#includenamespace{classThread{public:Thread():mThread(ThreadStart,this){std::coutRun();}voidjoin(){mThread.join();}virtualvoidRun()=0;protected:std::threadmThread;};classVerbo