【发布时间】:2011-07-29 06:24:15
【问题描述】:
我想使用 __thread 存储类将一些变量定义为线程特定的。但是三个问题让我犹豫了:
- 真的是c99的标准吗?或者更重要的是,编译器支持有多好?
- 是否会在每个线程中初始化变量?
- 非多线程程序是否将它们视为普通旧全局程序?
【问题讨论】:
-
作为对收到的答案的附加,线程本地存储计划用于即将推出的标准 C1x。
标签: c multithreading c99
我想使用 __thread 存储类将一些变量定义为线程特定的。但是三个问题让我犹豫了:
【问题讨论】:
标签: c multithreading c99
回答您的具体问题:
__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) 非多线程应用程序是单线程应用程序。
【讨论】:
__thread 关键字。即将推出的 C1x 预计将包括线程本地存储类,但它绝对不是 C99 的一部分。