在c99中使用__thread

Adr*_*ala 4 c multithreading c99

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

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

R..*_*R.. 5

回答您的具体问题:

  1. 不,它不是C99的一部分.您不会在n1256.pdf(C99 + TC1/2/3)或原始C99标准中的任何地方找到它.
  2. 是的,__thread变量在每个新线程中以其初始化值开始.
  3. 从程序行为的角度来看,线程局部存储类变量的行为与非多线程程序中的普通全局变量几乎相同.但是,它们确实会产生更多的运行时成本(内存和启动时间),并且可能存在线程局部变量的大小和数量限制的问题.所有这些都相当复杂,取决于您的程序是静态链接还是动态链接以及变量是驻留在主程序还是共享库中...

在实现C/POSIX之外(例如errno,等等),在我看来,线程本地存储类实际上并不是非常有用.它几乎是一个避免以上下文指针或类似形式干净地绕过必要状态的拐杖.您可能认为绕过破坏的接口可能很有用,例如qsort不接受上下文指针,但遗憾的是,无法保证qsort将在调用的同一线程中调用比较函数qsort.它可能会破坏作业并在多个线程中运行它.对于大多数其他可以采用这种解决方法的接口也是如此.