10

我是Boost.Threads的新手,正在尝试了解如何将函数参数传递给boost::thread_groups::create_thread()函数。在阅读了一些教程和 boost 文档之后,我了解到可以简单地将参数传递给这个函数,但我不能让这个方法工作。

我读到的另一种方法是使用函子将参数绑定到我的函数,但这会创建参数的副本,并且我严格要求传递 const 引用,因为参数将是大矩阵(我打算通过使用boost::cref(Matrix)一次来做到这一点我得到这个简单的例子来工作)。

现在,让我们开始编写代码:

void printPower(float b, float e)
{
    cout<<b<<"\t"<<e<<"\t"<<pow(b,e)<<endl;
    boost::this_thread::yield();
    return;
}

void thr_main()
{
    boost::progress_timer timer;
    boost::thread_group threads;
    for (float e=0.; e<20.; e++)
    {
        float b=2.;
        threads.create_thread(&printPower,b,e);
    }
    threads.join_all();
    cout << "Threads Done" << endl;
}

这不会编译并出现以下错误:

mt.cc: In function âvoid thr_main()â:
mt.cc:46: error: no matching function for call to âboost::thread_group::create_thread(void (*)(float, float), float&, float&)â
/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp: In member function âvoid boost::detail::thread_data<F>::run() [with F = void (*)(float, float)]â:
mt.cc:55:   instantiated from here
/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp:61: error: too few arguments to function

我究竟做错了什么?

4

2 回答 2

16

您不能将参数传递给boost::thread_group::create_thread()函数,因为它只有一个参数。你可以使用boost::bind

threads.create_thread(boost::bind(printPower, boost::cref(b), boost::cref(e)));
#                                             ^ to avoid copying, as you wanted

或者,如果你不想使用boost::bind,你可以这样使用boost::thread_group::add_thread()

threads.add_thread(new boost::thread(printPower, b, e));
于 2013-05-01T13:40:10.177 回答
6

为了获得更大的灵活性,您可以使用:

-Lambda 函数 (C++11):什么是 C++11 中的 lambda 表达式?

threads.create_thread([&b,&e]{printPower(b,e);});

- 将参数存储为 const 引用的函子。

struct PPFunc {
    PPFunc(const float& b, const float& e) : mB(b), mE(e) {}
    void operator()() { printPower(mB,mE); }
    const float& mB;
    const float& mE;
};

-std::bind (C++11) 或 boost::bind

于 2013-05-01T13:48:59.093 回答