将ofstream传递给线程函数

时间:2011-11-11 12:13:13

标签: c++ multithreading boost

当我尝试将对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> >]â

如果我取出线程位并正常传递函数的引用,则没有问题。 任何帮助赞赏。 感谢

1 个答案:

答案 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)...;它可能尚未在您的编译器上实现,它可能不会被设计使用(以防止意外地在线程之间共享数据)