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

时间:2012-01-24 14:12:22

标签: c++ multithreading posix

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

特定于线程的数据接口看起来有点笨重,特别是一旦你混合使用pthread_once,各种初始化器等等。

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

我想不出这样的原因,只要它被包含在互斥锁中就不会起作用,但是我没有看到它的任何建议或类似的东西让我感到困惑,因为它听起来比提供的API容易得多。我知道线程可以有很多捕获22,所以我想我会问,看看我是否准备介入......一些不愉快的事情? :)

2 个答案:

答案 0 :(得分:5)

  

我想不出这样一个原因,只要它被包含在互斥锁中就不会起作用

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

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

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

答案 1 :(得分:3)

  1. pthread特定于线程的数据 - 存在于标准库容器之前
  2. 特定于线程的数据避免了锁定的需要,并确保没有其他线程与数据混淆
  3. 线程消失时自动清理数据
  4. 话虽如此,没有什么可以阻止你使用自己的解决方案。如果您可以确定在任何线程运行之前完全构造容器(静态线程模型),您甚至不需要互斥锁。