使用BOOST线程属性会导致绑定编译错误

时间:2012-12-13 21:17:02

标签: c++ multithreading boost compilation bind

好的..首先,我不得不说我正在使用BOOST来源(我必须)。 我既是BOOST又是C ++新手,但我并不擅长编码(我很习惯使用托管语言)。我在一个有点大的项目中遇到了这个问题,然后我在这里的小代码片段中再现了它:

#include <boost/thread.hpp>

void foo(int bar) {
    printf("Chu %d!",bar);
}

int main() {
    boost::thread_attributes attrs;

    boost::thread causeTrouble(attrs,foo,42); // <-- Probably problematic line
    causeTrouble.join();
}

根据BOOST 1.52.0 Documentation,这个片段应该编译并运行正常;但是,它在BOOST库头文件中给出了一个奇怪的编译问题(没有其他错误或警告):

<boost_path>/bind/bind.hpp:313: error: no match for call to '(boost::thread_attributes) (void (*&)(int), int&)

对我来说,看起来没有实际的boost :: thread(boost :: thread_attributes,F f)构造函数,即使它应该是根据之前链接的文档。 无论如何,有趣的是以下几行编译正确

boost::thread noTrouble(attrs,foo);

boost::thread noTroubleEither(foo,42);

即使我彻底搜索了StackOverflow和互联网的其余部分,我也不知道在哪里转过头:(事实上这是我第一次被迫实际上提出新问题。帮助!

5 个答案:

答案 0 :(得分:4)

你说,

  

看起来没有实际的boost :: thread(boost :: thread_attributes,F f)

这不是你试图打电话的构造函数。你在呼叫boost::thread(attrs, foo, 42)。基于链接,看起来没有实现boost::thread(boost::attributes, F, Args)构造函数,因此投诉。

首先尝试显式使用boost::bind42绑定到foo并在绑定的函数对象上启动线程。

这样的事情:

boost::function< void > f = boost::bind( foo, 42 );
boost::thread( attrs, f )

答案 1 :(得分:1)

看起来像转发问题。尝试使用值42定义int变量并将其作为第三个参数传递。

答案 2 :(得分:0)

所需的重载

template <class F, class Arg, class ...Args>
thread(attributes const& attrs, F&& f, Arg&& arg, Args&&... args) 
仅当编译器支持可变参数模板和右值引用时才定义

。这可以解释你的问题。

我想可以改进文档以清楚地表明这一点。请问你能创建一个跟踪此问题的Trac票吗?

答案 3 :(得分:0)

您可能需要使用boost::bind,如下所示:

boost::function< void > f = boost::bind( foo, 42 );

boost::thread( attrs, f )

答案 4 :(得分:0)

你应该为属性提供stacksize,这是一个例子:

    #include <boost/thread.hpp>
    #include <boost/chrono.hpp>
    #include <iostream>

    void wait(int seconds)
    {
    boost::this_thread::sleep_for(boost::chrono::seconds{seconds});
    }

    void thread()
    {

    try
    {
        for (int i = 0; i < 5; ++i)
        {
        wait(1);
        std::cout << i << '\n';
        }
    }
    catch (boost::thread_interrupted&) {}
    }

    int main()
    {
    boost::thread::attributes attrs;
    attrs.set_stack_size(1024);
    boost::thread t{attrs, thread};
    t.join();
    }