当我尝试将对ofstream的引用传递给线程函数时,我一直在查看线程并遇到错误:
这是代码:
void threader(ofstream& fsOutputFileStream)
{
fsOutputFileStream << "hello";
}
int main()
{
ofstream fsOutputFileStream;
fsOutputFileStream.open("afile.txt", ios::out);
thread t(threader, fsOutputFileStream);
thread u(threader, fsOutputFileStream);
t.join();
u.join();
}
当我尝试编译时,我收到此错误:
threadtest.cpp:18: error: initializing argument 2 of âboost::thread::thread(F, A1) [with F = void (*)(std::ofstream&), A1 = std::basic_ofstream<char, std::char_traits<char> >]â
如果我取出线程位并正常传递函数的引用,则没有问题。 任何帮助赞赏。 感谢
答案 0 :(得分:1)
未经过测试,但请尝试std::ref
。
基本原理:thread
构造函数使用可变参数模板转发参数;如果perfect forwarding is not enabled there 1 ,则需要包装引用,以便它不会通过值传递。)
void threader(ofstream& fsOutputFileStream)
{
fsOutputFileStream << "hello";
}
int main()
{
ofstream fsOutputFileStream;
fsOutputFileStream.open("afile.txt", ios::out);
thread t(threader, std::ref(fsOutputFileStream));
thread u(threader, std::ref(fsOutputFileStream));
t.join();
u.join();
}
P.S。考虑为输出流添加同步...
1 完美转发需要pack expansion like std::forward<Args>(arguments)...
;它可能尚未在您的编译器上实现,或它可能不会被设计使用(以防止意外地在线程之间共享数据)