在c99中使用__thread

时间:2011-07-29 06:24:15

标签: c multithreading c99

我想使用__thread存储类将一些变量定义为特定于线程的。但是有三个问题让我犹豫不决:

  1. 这是c99的标准吗?或者更重要的是,编译器支持有多好?
  2. 变量是否会在每个线程中初始化?
  3. 非多线程程序是否将它们视为普通旧的全局变量?

2 个答案:

答案 0 :(得分:5)

回答您的具体问题:

  1. 不,它不是C99的一部分。您不会在n1256.pdf(C99 + TC1 / 2/3)或原始C99标准中的任何地方找到它。
  2. 是的,__thread变量以每个新线程中的初始值开始。
  3. 从程序行为的角度来看,线程局部存储类变量的行为与非多线程程序中的普通全局变量几乎相同。但是,它们会产生更多的运行时成本(内存和启动时间),并且可能存在线程局部变量的大小和数量限制的问题。所有这些都相当复杂,取决于您的程序是静态链接还是动态链接以及变量是驻留在主程序还是共享库中......
  4. 在实现C / POSIX之外(例如errno等),在我看来,线程局部存储类实际上并不是非常有用。它几乎是一个避免以上下文指针或类似形式干净地绕过必要状态的拐杖。您可能认为绕过像qsort这样不带上下文指针的破坏接口可能很有用,但不幸的是,不能保证qsort将在调用的同一个线程中调用比较函数qsort。它可能会破坏作业并在多个线程中运行它。大多数其他接口都可以采用这种解决方法。

答案 1 :(得分:2)

你可能想读这个:

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)非多线程应用程序是单线程应用程序。