【问题标题】:Is it possible to launch boost thread on a non static member function from other memeber function是否可以从另一个成员函数在非静态成员函数上启动 boost 线程
【发布时间】:2011-07-09 16:04:43
【问题描述】:

就像您可能知道的那样,boost 线程要求将 fwd 作为参数的 memeber 函数必须是静态的。如果它不是静态的,则有一种绑定方式,但我更喜欢 Object o; o.startThread() 比 对象o; boost::thread(boost::bind....) 因为它将线程代码保留在类中(也是异常处理)。 因此,例如,这可以重写以工作吗:

class sayHello
{
    string name;
public:
    sayHello(string name_):name(name_)
    {
    }
    void repeatHello()
    {
        while (true)
        {
            boost::this_thread::sleep(posix_time::seconds(3));
            cout<<"Hello "<<name<<endl;
        }
    }
    void infiniteRun()
    {
        boost::thread thr(repeatHello);//broken line
    }
};

附:对于徘徊什么是“绑定方式”AFAIK的人来说,它是这样的:

sayHello sh("world");
boost::thread thr(boost::bind(&sayHello::repeatHello,&sh));

【问题讨论】:

    标签: multithreading boost bind


    【解决方案1】:

    是的……

    void infiniteRun()
    {
        boost::thread thr(boost::bind(&sayHello::repeatHello,this));
    }
    

    虽然这样做充满了内存泄漏和访问冲突的危险。在处理线程时,我强烈建议使用智能指针来保持正确的活动状态。

    【讨论】:

    • 我根本看不出它怎么可能有内存泄漏,也可能没有访问冲突。如果析构函数做的第一件事就是停止线程,有什么害处?
    • @John:是的,如果您对所有内容都进行了完美的编码,那么一切都不会中断。但并非所有内容都能完美编码。这就是为什么智能指针是个好主意的原因。因为它们确保内存将继续存在。
    • 我知道智能指针的用途。我只是不知道他们会在这里赢得你什么。
    • @John:使用线程和绑定时最常见的错误之一是绑定参数超出范围,因此被破坏,从而导致内存损坏和/或分段失败(如果您是幸运的)。使用智能指针可以防止这种情况。试图将 Boost Thread 代码包装到继承线程对象范式中的人特别容易犯这种错误。
    • @NoSenseEtAl:是的,我就是这个意思。如果不是传入原始指针,在您的情况下是“this”,而是传入一个智能指针,只要线程处于活动状态,它就会防止对象被破坏。由于使用“this”,您的情况并不容易做到。但可以通过使用 enabled_shared_from_this 实用程序来完成,例如。
    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多