在VC ++中使用MultiThread和boost

时间:2014-08-13 13:30:35

标签: c++ multithreading boost

我是提升,C ++和线程的新手,我正在尝试使用使用boost库的线程,但我无法通过对象访问函数。

这是我正在做的事情:

#include <iostream>
#include <boost/thread.hpp>
using namespace std;
class myclass
{
    int a,b;
    public:
    void print_a();
    void print_b();
};

void myclass::print_a()
{
 for(int i=1;i<1000000;++i) cout<<"printing a"<<endl;
}
void myclass::print_b()
{
    for(int i=1;i<1000000;++i) cout<<"printing b"<<endl;
}

void print_x()
{
    for(int i=1;i<1000000;++i) cout<<"printing x"<<endl;
}

void print_y()
{
    for(int i=1;i<1000000;++i) cout<<"printing y"<<endl;
}

int main()
{
    myclass obj;
    boost::thread thread_a(obj.print_a);
    boost::thread thread_b(obj.print_b);
    boost::thread thread_x(print_x);
    boost::thread thread_y(print_y);
    thread_a.join();
    thread_b.join();
    thread_x.join();
    thread_y.join();
    return 0;
}

调用boost::thread thread_a(obj.print_a)pointer to a bound function may only be called to use this function时出错,与thread_b相同,但对于thread_x和thread_y,它正常工作。 我错过了什么,请指导我

谢谢 此致

1 个答案:

答案 0 :(得分:4)

除非有一个我不知道的新语法,否则你不能将obj.print_a作为“runnable”传递

boost::bind( &myclass::print_a, &obj ); 

std::bind如果您的版本支持它。

碰巧boost::thread有一个多参数版本,可以为你做绑定。因此,当您创建线程

boost::thread thread_a( &myclass::print_a, &obj );

在C ++ 11中,您也可以使用lambdas

[&obj]{ obj.print_a(); } 

因此在一行

boost::thread thread_a( [&obj]{ obj.print_a(); } );

或者如果看起来太乱,请指定lambda(当然可以使用auto作为其类型)并将其传递给另一行。