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

  • 在c99中真的是标准的吗?或更重要的是,编译器支持的性能如何?
  • 变量会在每个线程中初始化吗?
  • 非多线程程序会将它们视为普通旧全局变量吗?
  • 最佳答案

    要回答您的特定问题:

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

  • 在我看来,除了实现C/POSIX(例如errno等)之外,线程本地存储类实际上不是很有用。避免以上下文指针或类似形式干净地传递必要的状态非常重要。您可能会认为这对于绕开不带上下文指针的qsort之类的损坏接口(interface)很有用,但是不幸的是,无法保证qsort将在与称为qsort相同的线程中调用比较函数。它可能会分解工作,并在多个线程中运行它。对于大多数其他可能可行的解决方法的界面也是如此。

    关于c - 在C99中使用__thread,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6869391/

    10-13 07:34