C++20中头文件syncstream的使用

<syncstream>是C++20中新增加的头文件,提供了对同步输出流的支持,即在多个线程中可安全地进行输出操作,此头文件是Input/Output库的一部分。包括:

1.std::basic_syncbuf:是std::basic_streambuf的包装器(wrapper),它将输出累积在其自己的内部缓冲区中,并在销毁时以及明确请求时将其全部内容自动传输到包装的缓冲区,以便它们显示为连续的字符序列。此类模板主要用于创建与多线程程序无缝协作的自定义流类。如果多个线程试图同时写入同一个流,std::basic_syncbuf将确保每个线程的输出都以正确的顺序写入流,而不会出现任何交错。

cpp 复制代码
using syncbuf  = basic_syncbuf<char>;
using wsyncbuf = basic_syncbuf<wchar_t>;

2.std::basic_osyncstream:是std::basic_syncbuf的便捷包装器。它提供了一种机制来同步写入同一流的线程。

cpp 复制代码
using osyncstream  = basic_osyncstream<char_t>;
using wosyncstream = basic_osyncstream<wchar_t>;

测试代码如下:

cpp 复制代码
namespace {

void func1(int id, std::ostream& sync_out)
{
	std::osyncstream sync_stream(sync_out);
	sync_stream << "thread " << id << " is running" << std::endl;
}

void func2(int id, std::ostream& out)
{
	out << "thread " << id << " is running" << std::endl;
}

void sync(std::ofstream& file_out)
{
	std::syncbuf sync_buf(file_out.rdbuf());
	std::ostream sync_out(&sync_buf);

	constexpr int num_threads{ 10 };
	std::vector<std::thread> threads;

	for (int i = 0; i < num_threads; ++i)
		threads.emplace_back(func1, i, std::ref(sync_out));

	for (auto& t : threads)
		t.join();
}

void common(std::ofstream& file_out)
{
	constexpr int num_threads{ 10 };
	std::vector<std::thread> threads;

	for (int i = 0; i < num_threads; ++i)
		threads.emplace_back(func2, i, std::ref(file_out));

	for (auto& t : threads)
		t.join();
}

} // namespace

int test_syncstream()
{
#ifdef _MSC_VER
	std::ofstream file_out1("../../../testdata/output1.txt");
	std::ofstream file_out2("../../../testdata/output2.txt");
#else
	std::ofstream file_out1("testdata/output1.txt");
	std::ofstream file_out2("testdata/output2.txt");
#endif

	if (!file_out1 || ! file_out2) {
		std::cerr << "fail to open file for writing" << std::endl;
		return -1;
	}

	sync(file_out1);
	common(file_out2);

	file_out1.close();
	file_out2.close();
	return 0;
}

执行结果如下图所示:每次输出并不完全一致:output2.txt中输出是乱的,而output1.txt中的输出是正常的

GitHub :https://github.com/fengbingchun/Messy_Test

相关推荐
Lucis__6 天前
C++20概念约束—现代C++模板约束的演进与重构
c++20·程序·κzy
SunkingYang16 天前
C++20 vs C++17:新特性对比与用法指南
c++·c++20·特性·版本·新特性·对比·c++17
前进吧-程序员16 天前
C++20 协程入门实战:从 co_await 到一个 100 行的异步任务调度器
网络·c++·c++20
前进吧-程序员16 天前
实战:C++20 协程 + io_uring 写一个 400 行的 echo server
网络·c++·c++20
骑着蜗牛撵大象32717 天前
C++20 协程 × 屏障:手写一个 co_await 版 Barrier,让等待不再钉死线程
android·c++20·协程·并发编程·co_await·屏障同步
闻缺陷则喜何志丹18 天前
【c++20】协程与屏障
c++·算法·c++20·携程·屏障
努力努力再努力wz19 天前
【C++高阶系列】C++20 协程底层原理:函数为什么能暂停?从状态机到 Task,彻底串起挂起、恢复与协程调度
开发语言·c++·c++20·1024程序员节
fpcc1 个月前
c++20新功能—std::osyncstream
c++·c++20
啦啦啦啦啦zzzz1 个月前
一致性哈希
服务器·算法·哈希算法·c++20·分布式存储
keep intensify1 个月前
C++20线程池
c++·算法·c++20