使用boost:thread的Runnable类

时间:2014-04-05 10:29:49

标签: c++ multithreading inheritance c++11 boost

编辑> 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();

2 个答案:

答案 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()来等待开始条件。