我使用新的c ++ 11 std::thread
界面遇到了问题
我无法弄清楚如何将对std::ostream
的引用传递给线程将执行的函数。
以下是传递整数的示例(在gcc 4.6下按预期编译和工作):
void foo(int &i) {
/** do something with i **/
std::cout << i << std::endl;
}
int k = 10;
std::thread t(foo, k);
但是当我尝试传递一个ostream时,它无法编译:
void foo(std::ostream &os) {
/** do something with os **/
os << "This should be printed to os" << std::endl;
}
std::thread t(foo, std::cout);
有没有办法做到这一点,或者根本不可能?
注意:从编译错误来看,它似乎来自一个已删除的构造函数......
答案 0 :(得分:50)
线程复制他们的论点(考虑一下,那就是正确的事)。如果您需要显式引用,则必须使用std::ref
(或std::cref
对其进行常量引用):
std::thread t(foo, std::ref(std::cout));
(引用包装器是一个包含引用值的语义包装器。也就是说,你可以复制包装器,所有副本都包含相同的引用。)
像往常一样,只要您引用的对象保持活动状态,此代码才是正确的。注意事项。