3

好的.. 首先,我不得不说我正在使用 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 文档,这个片段应该既可以编译又可以正常运行;但是,它在 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 和互联网的其余部分,我也不知道该从哪里转头 :( 事实上这是我第一次被迫提出一个新问题。求助!

4

5 回答 5

4

你说,

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

不过,这不是您要调用的构造函数。你在打电话boost::thread(attrs, foo, 42)。根据链接,看起来没有boost::thread(boost::attributes, F, Args)实现构造函数,因此投诉。

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

像这样的东西:

boost::function< void > f = boost::bind( foo, 42 );
boost::thread( attrs, f )
于 2012-12-13T21:31:18.587 回答
1

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

于 2012-12-13T21:25:34.347 回答
0

需要的过载

template <class F, class Arg, class ...Args>
thread(attributes const& attrs, F&& f, Arg&& arg, Args&&... args) 

仅当编译器支持可变参数模板和右值引用时才定义。这可以解释你的问题。

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

于 2012-12-15T18:31:28.080 回答
0

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

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

boost::thread( attrs, f )
于 2016-03-29T05:40:17.387 回答
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();
    }
于 2016-06-16T22:19:44.437 回答