C++ 访问boost::thread构造时使用的可调用对象

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 1.49和MSVC10

如果一个
boost::thread
是用一个可调用的object1构建的,并且该对象具有我想从
线程的上下文外部访问的成员函数或变量,那么我如何访问callabe对象

例如,我实现了一个生成5个工作线程的简单应用程序,保存到
vector
local to
main()
。这些线程中的每一个都用一个可调用的对象,
Gizmo
实例化,该对象在其构造函数中接受一个
char
参数。此
char
保存为
std::string
成员变量,位于
Gizmo
类中。每个线程将
cout
保存的
string
,然后休眠250毫秒。它将永远在此循环中继续,直到saves
string
的值变为“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;