编辑> This tutorial提供了一个很好的答案
如何使用boost::thread
使类可运行?
class Hello
{
void run();
bool canRun();
boost::condition_variable cond;
boost::mutex mut;
};
Hello::run()
{
boost::unique_lock<boost::mutex> lock(this->mut);
while (!this->canRun())
this->cond.wait(lock);
// do my stuff
}
我不知道我是否应该继承boost::thread
,在班上有boost::thread
属性...
我希望能够这样做:
Hello hello = Hello();
hello.run();
hello.stop();
答案 0 :(得分:4)
我认为你应该在你的类中放一个线程实例,并且在run()方法中你可以启动线程(当然还有另一个成员函数)。在stop()中,您可以在设置canRun = false
后调用thread :: join()。
答案 1 :(得分:1)
我说,为什么不:) 见 Live On Coliru
它与c ++ 03兼容。
#include <boost/thread.hpp>
struct Hello
{
void run();
bool canRun() { return true; }
boost::condition_variable cond;
boost::mutex mut;
};
void Hello::run()
{
boost::unique_lock<boost::mutex> lock(this->mut);
cond.wait(lock, boost::bind(&Hello::canRun, this));
std::cout << "Done";
}
int main()
{
Hello obj;
boost::thread th(&Hello::run, &obj);
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
{
boost::lock_guard<boost::mutex> lk(obj.mut);
obj.cond.notify_one();
}
th.join();
}
请注意,我使用谓词版wait()
来等待开始条件。