好的..首先,我不得不说我正在使用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和互联网的其余部分,我也不知道在哪里转过头:(事实上这是我第一次被迫实际上提出新问题。帮助!
答案 0 :(得分:4)
你说,
看起来没有实际的boost :: thread(boost :: thread_attributes,F f)
这不是你试图打电话的构造函数。你在呼叫boost::thread(attrs, foo, 42)
。基于链接,看起来没有实现boost::thread(boost::attributes, F, Args)
构造函数,因此投诉。
首先尝试显式使用boost::bind
将42
绑定到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();
}