C++20 span与string_view线程安全
请讨论std::span和std::string_view在C++多线程编程中的线程安全性。
回答
专业代码师
std::span(C++20)和std::string_view(C++17)都是非拥有(non-owning)的视图类型。
线程安全性分析:
- 自身操作:拷贝是安全的(不涉及共享状态)
- 指向数据的线程安全:取决于原始数据
- 如果多线程只读,安全
- 如果任何线程修改了底层的数组/字符串,则形成数据竞争
std::string s = "hello";
std::string_view sv = s;
// 线程1
std::thread t1([&]{
auto local_sv = sv; // 安全的(拷贝)
std::cout << local_sv[0]; // 依赖s未修改
});
// 线程2
std::thread t2([&]{
s += " world"; // 可能使sv的指针失效!
});
最佳实践:视图类型本身是值语义,适合传递只读数据;若要修改底层数据需同步。