特定于线程的数据 - 为什么我不能只使用带有线程 ID 的静态映射?
Thread-specific data - why can't I just use a static map with thread IDs?
在阅读POSIX线程时,我遇到了一个特定于线程的数据示例。我脑子里确实有一个困惑的地方。。。
特定于线程的数据接口看起来有点笨重,尤其是当您混合使用pthread_once、各种初始化程序等时。
我不能只使用静态std::map,其中键是pthread_self()id,数据值保存在std::对的第二部分,这有什么原因吗?
我想不出为什么只要它被包装在互斥对象中就不起作用,但我看不到任何让我困惑的暗示或类似的东西,因为它听起来比提供的API容易得多。我知道穿线可能有很多第二十二条军规,所以我想我应该问问,看看我是否会介入……一些不愉快的事情?:)
我想不出有什么理由只要它被包裹在互斥中就不起作用
这本身就是一个很好的理由;如果实现得当,您可以访问线程特定的数据,而不必阻止其他线程同时创建或访问它们的数据。
还有一般的效率(恒定时间访问,与使用std::map
的对数时间相比),不能保证pthread_t
定义了合适的顺序,以及与所有其他线程资源一起自动清理。
如果您不喜欢Posix API,可以使用C++11的thread_local
关键字或boost::thread_specific_ptr
。
- pthread线程特定的数据存在于标准库容器之前
- 线程特定的数据避免了锁定的需要,并确保没有其他线程干扰数据
- 线程消失时,数据会自动清理
话虽如此,没有什么能阻止你使用自己的解决方案。如果您可以确保在任何线程运行之前(静态线程模型)容器已经完全构建好,那么您甚至不需要互斥锁。
相关文章:
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 非静态成员失败的线程调用函数
- 线程时访问静态映射时出现隔离错误
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- C++:用IIFE线程初始化静态局部变量安全吗
- 多线程处理中的静态成员变量
- 确保静态布尔检查的线程安全
- VC++6 线程安全静态初始化
- 无效使用非静态成员函数 c++ 线程 linux
- 静态类数据成员的线程安全
- 错误:静态断言失败:std ::线程参数必须在转换为rvalues后不可行
- STD ::原子与静态变量用于线程同步
- 为什么这些静态函数没有按预期从另一个线程返回?
- 我怎么知道C++编译器是否制作线程安全的静态对象代码
- 线程上下文上的静态存储对象优化
- 为什么有一个额外的 & 将非静态成员函数的地址传递给 C++ 中的线程?
- C++函数中的多线程静态 POD 初始化
- 线程静态类方法与全局作用域
- c++ 0x线程静态链接问题