我想知道std::osyncstream
对象如何防止数据竞争?它是否锁定了某个互斥锁?
我特别是在谈论以下程序:
#include <iostream>
#include <fstream>
#include <thread>
#include <syncstream>
void worker( const std::size_t startValue, const std::size_t stopValue, std::ostream& os )
{
for ( auto idx { startValue }; idx < stopValue; ++idx )
{
std::osyncstream out { os };
out << "thread: " << std::this_thread::get_id( ) << "; work: " << idx << '\n';
}
}
void runThreads( std::ostream& os )
{
std::jthread t1 { worker, 10000, 20000, std::ref( os ) };
std::jthread t2 { worker, 20000, 30000, std::ref( os ) };
}
int main( )
{
std::ofstream file { "out.txt" };
runThreads( file );
}
上述代码的源代码可以在此处查看。尽管我进行了轻微修改以使其更好、更安全。
这个简单的程序将20000行内容输出到文件中,而不会产生混乱的输出。
可能的输出结果:
thread: 2; work: 10000
thread: 3; work: 20000
thread: 2; work: 10001
thread: 2; work: 10002
thread: 2; work: 10003
thread: 2; work: 10004
thread: 2; work: 10005
thread: 2; work: 10006
.
.
.
幕后发生了什么?这两个线程如何相互通信?它们是否有独立的syncstream
对象副本?这个对象(即out
)如何管理输出流os
?