我正在使用 Boost 1.49 和 MSVC10。
如果 aboost::thread
是用可调用对象1构造的,并且该对象具有我想从的上下文外部thread
访问的成员函数或变量,我如何访问 callabe 对象?
例如,我实现了一个简单的应用程序,它产生 5 个工作线程,保存到vector<boost::thread*>
本地到main()
. 这些线程中的每一个都使用一个可调用对象进行实例化,该对象在其构造函数中Gizmo
采用一个char
参数。这char
被保存为类std::string
中的成员变量Gizmo
。每个线程将cout
被保存string
,然后休眠 250 毫秒。它永远在这个循环中继续,直到不知何故 savesstring
的价值变成“死”。
#include <cstdlib>
#include <string>
#include <memory>
#include <vector>
using namespace std;
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
boost::mutex cout_mtx;
class Gizmo
{
public:
Gizmo(const string& state) : state_(state) {};
Gizmo(Gizmo&& rhs) : state_(std::move(rhs.state_)) {};
virtual ~Gizmo()
{
bool b = true;
}
void operator()();
string state_;
};
void Gizmo::operator()()
{
while( state_ != "die" )
{
{
boost::mutex::scoped_lock scoped_lock(cout_mtx);
cout << state_ << flush;
}
boost::this_thread::sleep(boost::posix_time::milliseconds(250));
}
}
boost::thread* start_thread(char c)
{
Gizmo g(string(1,c));
return new boost::thread(g);
}
int main()
{
vector<boost::thread*> threads;
string d=".*x%$";
for( string::const_iterator it = d.begin(); it != d.end(); ++it )
{
threads.push_back(start_thread(*it));
}
for( auto th = threads.begin(); th != threads.end(); ++th )
(*th)->join();
}
现在我想进行代码更改,main()
其中将:
- 获得
thread
第一名vector
- 获取其中
Gizmo
包含的对象thread
- 设置
state_
为“死”
我如何获得Gizmo
线程内的内容?
for( auto th = threads.begin(); th != threads.end(); ++th )
{
boost::this_thread::sleep(boost::posix_time::seconds(1));
Gizmo& that_gizmo = (*th)-> ??? ; // WHAT DO I DO?
that_gizmo.state_ = "die";
}
(1)在这种情况下,可调用对象意味着 aclass
和operator()
。