Boost1.49とMSVC10を使用しています。
aboost::thread
が呼び出し可能なオブジェクト1で構成されていて、そのオブジェクトに、コンテキストの外部thread
からアクセスしたいメンバー関数または変数がある場合、callabeオブジェクトにアクセスするにはどうすればよいですか?
たとえば、vector<boost::thread*>
ローカルに保存された5つのワーカースレッドを生成する単純なアプリケーションを実装しましたmain()
。これらの各スレッドは、コンストラクターでGizmo
1つのchar
パラメーターを受け取る呼び出し可能なオブジェクトでインスタンス化されます。これは、クラスのメンバー変数char
として保存されます。各スレッドは保存され、250ミリ秒間スリープします。どういうわけかsavesの値が「die」になるまで、このループで永遠に続きます。std::string
Gizmo
cout
string
string
#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)このコンテキストでの呼び出し可能オブジェクトclass
とは、。を伴うaを意味しoperator()
ます。