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

标签 c++ multithreading posix

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

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

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

我想不出只要它被包裹在互斥量中就无法工作的原因,但我没有看到任何关于它的建议或任何类似的东西让我感到困惑,因为它听起来比提供的 API 容易得多。我知道线程可能有很多 catch-22,所以我想我会问一下,看看我是否要介入……一些不愉快的事情? :)

最佳答案

I can't think of a reason that this wouldn't work as long as it was wrapped in a mutex

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

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

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

关于c++ - 特定于线程的数据——为什么我不能只使用带有线程 ID 的静态映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8988253/

相关文章:

c - 使用 Regex (POSIX) 在 #ifdef 语句外查找 printf() 调用

c++ - 如何为代码块中的所有 cout 设置精度?

c++ - GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6

java - Android 线程详细信息

c - 如何将 POSIX 信号量值设置为 1?

shell - shell 脚本中的命令替换,无需通配符

c++ - 重复排列的排名和取消排名

C++ SLList - 从堆中删除临时节点?

C++ `Timer` 类实现

java - 如何保持线程执行直到异步线程返回回调