C++ 访问boost::thread构造时使用的可调用对象
我使用的是Boost 1.49和MSVC10 如果一个C++ 访问boost::thread构造时使用的可调用对象,c++,boost,boost-thread,C++,Boost,Boost Thread,我使用的是Boost 1.49和MSVC10 如果一个boost::thread是用一个可调用的object1构建的,并且该对象具有我想从线程的上下文外部访问的成员函数或变量,那么我如何访问callabe对象 例如,我实现了一个生成5个工作线程的简单应用程序,保存到vectorlocal tomain()。这些线程中的每一个都用一个可调用的对象,Gizmo实例化,该对象在其构造函数中接受一个char参数。此char保存为std::string成员变量,位于Gizmo类中。每个线程将cout保存的
boost::thread
是用一个可调用的object1构建的,并且该对象具有我想从线程的上下文外部访问的成员函数或变量,那么我如何访问callabe对象
例如,我实现了一个生成5个工作线程的简单应用程序,保存到vector
local tomain()
。这些线程中的每一个都用一个可调用的对象,Gizmo
实例化,该对象在其构造函数中接受一个char
参数。此char
保存为std::string
成员变量,位于Gizmo
类中。每个线程将cout
保存的string
,然后休眠250毫秒。它将永远在此循环中继续,直到savesstring
的值变为“die”
:
(1) 在此上下文中,可调用对象是指带有运算符()
的类,您不能实现开始线程
类,让您可以访问函子而不是函数,并保留指向这些函数的指针向量吗?大致如下(细节有待解决,没有一个经过测试):
您需要将gizmo\u
作为boost::ref(gizmo\u)
传递给线程构造函数。您能否实现一个start\u thread
类,让您访问函子而不是函数,并保留指向这些函数的指针向量?大致如下(细节有待解决,没有一个经过测试):
您需要将gizmo\u
作为boost::ref(gizmo\u)
传递给线程构造函数。您的start\u thread()方法正在创建一个临时堆栈对象,然后将该对象传递给线程。相反,您应该在main()中创建Gizmo对象的向量,然后将该向量的每个成员(Gizmo)传递给boost的线程构造函数。我看不出有什么理由在可以存储
在主函数的向量中引用它
记住在主线程和检查它的boost线程之间同步状态设置。您的start\u thread()方法正在创建一个临时堆栈对象,然后将该对象传递给线程。相反,您应该在main()中创建Gizmo对象的向量,然后将该向量的每个成员(Gizmo)传递给boost的线程构造函数。我看不出有什么理由在可以存储
在主函数的向量中引用它
记住在主线程和检查它的boost线程之间同步状态设置。boost::thread
不提供获取可调用对象的功能<代码>boost::thread
有一个默认构造函数,因此它不知道作为线程入口点的可调用类型或函数。另外,如果boost::thread
没有执行类型擦除,那么就不可能再在同一集合或线程池中管理具有不同入口点的线程。例如,std::vector
只能管理Gizmo
线程,而std::vector
可以管理Gizmo
线程和非Gizmo
线程
<> >而不是必须管理<代码> Gizmo < /COD>和<代码> Boo::在单独的列表中创建线程< /代码>对象,或者创建一个新的类型来将这两个对象配对在一起,考虑通过代码< > STD::配对> /代码>或<代码> Boo::tuple < /代码>来关联这两个对象。例如:
std::vector< boost::tuple< boost::thread*, Gizmo > > threads;
void shutdown_gizmo( Gizmo& );
boost::function< void() > fn = boost::bind( shutdown_gizmo, boost::ref( gizmo ) );
// The tuple now contains a function object, decoupling it from Gizmo objects,
// and allowing other shutdown methods to be paired with threads.
typedef boost::tuple< boost::thread*, boost::function< void() > > tuple_t;
std::vector< tuple_t > threads;
对于任何解决方案,只需小心维护
Gizmo
对象的范围,以及维护正确的Gizmo
对象的句柄。很容易无意中获取实际Gizmo
对象副本的句柄。boost::thread不提供获取可调用对象的功能<代码>boost::thread有一个默认构造函数,因此它不知道作为线程入口点的可调用类型或函数。另外,如果boost::thread
没有执行类型擦除,那么就不可能再在同一集合或线程池中管理具有不同入口点的线程。例如,std::vector
只能管理Gizmo
线程,而std::vector
可以管理Gizmo
线程和非Gizmo
线程
<> >而不是必须管理<代码> Gizmo < /COD>和<代码> Boo::在单独的列表中创建线程< /代码>对象,或者创建一个新的类型来将这两个对象配对在一起,考虑通过代码< > STD::配对> /代码>或<代码> Boo::tuple < /代码>来关联这两个对象。例如:
std::vector< boost::tuple< boost::thread*, Gizmo > > threads;
void shutdown_gizmo( Gizmo& );
boost::function< void() > fn = boost::bind( shutdown_gizmo, boost::ref( gizmo ) );
// The tuple now contains a function object, decoupling it from Gizmo objects,
// and allowing other shutdown methods to be paired with threads.
typedef boost::tuple< boost::thread*, boost::function< void() > > tuple_t;
std::vector< tuple_t > threads;
对于任何解决方案,只需小心维护
Gizmo
对象的范围,以及维护正确的Gizmo
对象的句柄。无意中获取实际Gizmo
对象副本的句柄是相当容易的。+1:是的,我想我可以。我希望我可以使用内置的设备,而不是构建某种封装设备。按照您的建议,我还必须使用join\u all()
type函数等实现某种容器类;如果不需要的话,我宁愿不这样做。@johndilling是的,很遗憾没有可调用的句柄,但我想这可能会使同步变得复杂。+1:是的,我想我可以。我希望我可以使用内置的设备,而不是构建某种封装设备。按照您的建议,我还必须使用join\u all()
type函数等实现某种容器类。
void shutdown_gizmo( Gizmo& );
boost::function< void() > fn = boost::bind( shutdown_gizmo, boost::ref( gizmo ) );
// The tuple now contains a function object, decoupling it from Gizmo objects,
// and allowing other shutdown methods to be paired with threads.
typedef boost::tuple< boost::thread*, boost::function< void() > > tuple_t;
std::vector< tuple_t > threads;