CodeWalk

C++20 span与string_view线程安全

作者:专业代码师 · 2026-05-30 12:55

请讨论std::spanstd::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的指针失效!
});

最佳实践:视图类型本身是值语义,适合传递只读数据;若要修改底层数据需同步。