在阅读POSIX线程时,我遇到了一个特定于线程的数据示例。我脑子里确实有一个混乱的地方......
特定于线程的数据接口看起来有点笨重,特别是一旦你混合使用pthread_once,各种初始化器等等。
有什么理由我不能只使用静态std :: map,其中键是pthread_self()id,数据值是否保存在std :: pair的第二部分?
我想不出这样的原因,只要它被包含在互斥锁中就不会起作用,但是我没有看到它的任何建议或类似的东西让我感到困惑,因为它听起来比提供的API容易得多。我知道线程可以有很多捕获22,所以我想我会问,看看我是否准备介入......一些不愉快的事情? :)
答案 0 :(得分:5)
我想不出这样一个原因,只要它被包含在互斥锁中就不会起作用
这本身就是一个很好的理由;如果实施得当,您可以访问特定于线程的数据,而无需阻止其他线程同时创建或访问它们。
还有一般效率(恒定时间访问,相对于对数时间,如果使用std::map
),不保证pthread_t
具有合适的排序定义,以及自动清理以及所有其他线程资源。
如果您不喜欢Posix API,可以使用C ++ 11的thread_local
关键字或boost::thread_specific_ptr
。
答案 1 :(得分:3)
话虽如此,没有什么可以阻止你使用自己的解决方案。如果您可以确定在任何线程运行之前完全构造容器(静态线程模型),您甚至不需要互斥锁。