我正在尝试使用C++11中的std::thread。如果可以在执行其函数成员之一的类中拥有std::thread,我无法找到任何地方。考虑下面的例子......在我的尝试中(如下),函数是run()。我使用带有-std=c++0x标志的gcc-4.4进行编译。#ifndefRUNNABLE_H#defineRUNNABLE_H#includeclassRunnable{public:Runnable():m_stop(false){m_thread=std::thread(Runnable::run,this);}virtual~Runnable(){stop();}voidstop(
我正在使用C++11,我有一个std::thread,它是一个类成员,它每2分钟向监听器发送一次信息。其他的,它只是sleep。所以,我让它休眠2分钟,然后发送所需的信息,然后再次休眠2分钟。//MyClass.hppclassMyClass{~MyClass();RunMyThread();private:std::threadmy_thread;std::atomicm_running;}MyClass::RunMyThread(){my_thread=std::thread{[this,m_running]{m_running=true;while(m_running){std:
我读到C++中有一个新关键字:它是我读过的__thread。我只知道它是一个可以像static关键字一样使用的关键字,但我什么都不知道。这个关键字是否仅仅意味着,例如,如果一个变量是这样声明的:__threadintfoo;那么与该变量有关的任何事情都将使用新线程执行? 最佳答案 它是thread_local,而不是__thread。用于定义具有线程存储时长的变量。thread_local是在C++0x中添加的new存储持续时间说明符。还有其他存储时长:static、automatic和dynamic。来自thislink:thre
C++17引入了std::shared_mutex和std::scoped_lock。我现在的问题是,当它作为参数传递时,scoped_lock将始终以独占(写入器)模式锁定共享互斥锁,而不是在共享(读取器)模式下。在我的应用程序中,我需要使用来自对象src的数据更新对象dst。我想锁定src共享和dst独占。不幸的是,如果同时调用另一个带有src和dst切换的更新方法,这可能会导致死锁。所以我想使用std::scoped_lock的花哨的死锁避免机制。我可以使用scoped_lock在独占模式下同时锁定src和dst,但是这种不必要的严格锁定会在其他地方产生性能回退。但是,似乎可以将
boost::mutex::scoped_lock是一个方便的RAII包装器,用于锁定互斥锁。我对其他事情使用了类似的技术:一个RAII包装器,它要求数据接口(interface)从/重新连接到串行设备。不过,我想不通的是,为什么在下面的代码中只有我的对象mst(其实例化和销毁确实有副作用)会导致g++发出“未使用的变量”警告错误,而l设法保持沉默。你知道吗?你能告诉我吗?[generic@sentinel~]$cattest.cpp#include#include#includestructMyScopedThing;structMyWorkerObject{voida(){std:
#include#include#include#includeusingnamespacestd;voidf(constvector&coll){this_thread::sleep_for(1h);////Iscollguaranteedtobevalidbeforeexitingthisfunction?//}intmain(){{vectorcoll(1024*1024*100);thread(f,coll).detach();}////Iknowstd::threadwillcopyargumentsintoitselfbydefault,//butIdon'tknowwhe
这个程序:#includestructFoo{Foo(){std::cout打印Bar()~Bar()Foo()对我来说(GCC6.1、Linux、x86-64)。~Foo()永远不会被调用。这是预期的行为吗? 最佳答案 标准不包括这种情况;最严格的理解是,在具有静态存储持续时间的对象的析构函数中初始化thread_local是合法的,但允许程序继续正常完成是非法的。问题出现在[basic.start.term]:1-Destructors([class.dtor])forinitializedobjects(thatis,obje
假设我们有一个标题foo.h包含以下内容:#ifndefFOO_H_#defineFOO_H_namespacefoo{constexprstd::string_viewkSomeString="blah";}#endif//FOO_H_foo::kSomeString是否保证在包含foo.h的任何翻译单元中具有内部链接?这在C++11和C++17之间是否有所不同?在标准草案中[basic.link]/3说Anamehavingnamespacescopehasinternallinkageifitisthenameof[...]anon-inlinevariableofnon-vol
我在使用std::thread和lambdas时遇到了一些麻烦。我有一个TheMethod方法,我应该使用std::thread将一些函数调用并行化到同一个类中的方法。我定义了一个lambda函数,并尝试按如下方式将其传递给我创建的std::thread实例:autofunctor=[this](constCursor&c,size_t&result)->void{result=classMethod(c);};size_ta;Cursorcursor=someCursor();std::threadt1(functor,cursor,a);t1.join();不幸的是,编译器给了我:
我是C++新手(来自C#),正在编写一个多线程C++应用程序,想知道什么更好用:std::thread或它的Boost对应物?我看到了followingdiscussion在另一个StackOverflow帖子中,但仍然没有完全了解我为什么要选择一个而不是另一个。如果不启动新程序,我应该使用标准库还是Boost线程?谢谢! 最佳答案 如果您尚未在项目中使用boost,则没有理由使用boost::thread来支持std::thread。除非您使用的是STL中不可用的boost中的某些功能。std::thread足够适用于大多数用例,