我希望使用 __thread 存储类定义一些线程特定的变量。但是有三个问题让我犹豫:
- c99 标准真的支持吗?更重要的是,编译器支持得如何?
- 这些变量会在每个线程中初始化吗?
- 非多线程程序将如何处理它们?像普通全局变量一样吗?
我希望使用 __thread 存储类定义一些线程特定的变量。但是有三个问题让我犹豫:
针对您的具体问题:
__thread
变量在每个新线程中都以其初始化值开始。除了实现C/POSIX(例如errno
等)之外,线程局部存储类实际上并不是非常有用,我认为它基本上是一个绕过以上下文指针或类似方式传递必要状态的支撑。您可能认为它可以用于解决不接受上下文指针的破碎接口,如qsort
,但不幸的是,没有保证qsort
将在调用qsort
的同一线程中调用比较函数。它可能会将作业分解并在多个线程中运行。对于大多数其他接口,这种解决方法也是如此。
您可能希望阅读以下内容:
http://www.akkadia.org/drepper/tls.pdf
1) MSVC不支持C99。GCC和其他编译器尝试支持GCC兼容性。
编辑关于__thread
的编译器支持细节可以在此处找到:
http://chtekk.longitekk.com/index.php?/archives/2011/02/C8.html
2) 只有C ++支持初始化程序,且必须是常量。
3) 非多线程应用程序是单线程应用程序。