特定于线程的数据 - 为什么我不能只使用带有线程 ID 的静态映射?

Thread-specific data - why can't I just use a static map with thread IDs?

本文关键字:线程 静态 ID 不能 映射 为什么 于线程 数据      更新时间:2023-10-16

在阅读POSIX线程时,我遇到了一个特定于线程的数据示例。我脑子里确实有一个困惑的地方。。。

特定于线程的数据接口看起来有点笨重,尤其是当您混合使用pthread_once、各种初始化程序等时。

我不能只使用静态std::map,其中键是pthread_self()id,数据值保存在std::对的第二部分,这有什么原因吗?

我想不出为什么只要它被包装在互斥对象中就不起作用,但我看不到任何让我困惑的暗示或类似的东西,因为它听起来比提供的API容易得多。我知道穿线可能有很多第二十二条军规,所以我想我应该问问,看看我是否会介入……一些不愉快的事情?:)

我想不出有什么理由只要它被包裹在互斥中就不起作用

这本身就是一个很好的理由;如果实现得当,您可以访问线程特定的数据,而不必阻止其他线程同时创建或访问它们的数据。

还有一般的效率(恒定时间访问,与使用std::map的对数时间相比),不能保证pthread_t定义了合适的顺序,以及与所有其他线程资源一起自动清理。

如果您不喜欢Posix API,可以使用C++11的thread_local关键字或boost::thread_specific_ptr

  1. pthread线程特定的数据存在于标准库容器之前
  2. 线程特定的数据避免了锁定的需要,并确保没有其他线程干扰数据
  3. 线程消失时,数据会自动清理

话虽如此,没有什么能阻止你使用自己的解决方案。如果您可以确保在任何线程运行之前(静态线程模型)容器已经完全构建好,那么您甚至不需要互斥锁。