在c99中使用__thread
我想使用__thread存储类将一些变量定义为特定于线程的。 但是三个问题让我犹豫不决:
- 它真的是c99的标准吗? 或者更重要的是,编译器支持有多好?
- 变量是否会在每个线程中初始化?
- 非multithreading程序是否将它们视为普通的全局变量?
回答您的具体问题:
- 不,它不是C99的一部分。 您不会在n1256.pdf(C99 + TC1 / 2/3)或原始C99标准中的任何地方找到它。
- 是的,
__thread
thread变量以每个新线程中的初始值开始。 - 从程序行为的角度来看,线程局部存储类变量的行为与非multithreading程序中的普通全局变量几乎相同。 但是,它们会产生更多的运行时成本(内存和启动时间),并且可能存在线程局部变量的大小和数量限制的问题。 所有这些都相当复杂,取决于您的程序是静态链接还是动态链接以及变量是驻留在主程序还是共享库中…
在实现C / POSIX之外(例如errno
等),在我看来,线程局部存储类实际上并不是非常有用。 它几乎是一个避免以上下文指针或类似forms干净地绕过必要状态的拐杖。 您可能认为绕过像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)非multithreading应用程序是单线程应用程序。