I’ve been looking at threads and have run into an error when I try to pass a reference to an ofstream to the thread function:
This is the code:
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();
}
When I try to compile I get this error:
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> >]â
If I take the threading bits out and just pass the reference to the function normally there is no problem.
Any help appreciated.
Thanks
Not tested, but try
std::ref.rationale:
threadconstructor uses variadic templates to forward the arguments; if perfect forwarding is not enabled there1, you’ll need to wrap the reference so it doesn’t get passed by value).P.S. Consider adding synchronization for the output stream…
1 perfect forwarding requires a pack expansion like
std::forward<Args>(arguments)...; It might not yet be implemented on your compiler, or it might not be used by design (to prevent accidentally sharing data between threads)