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

Joh*_*0te 5 c++ multithreading posix

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

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

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

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

Mik*_*our 5

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

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

还有一般的效率(恒定时间访问,如果使用,则为对数时间std::map),无法保证pthread_t定义合适的顺序,以及自动清理以及所有其他线程资源.

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