_Thread_local 是否独立于 __STDC_NO_THREADS__?

Is _Thread_local independent from __STDC_NO_THREADS__?

目前看来_Thread_local独立于__STDC_NO_THREADS__

结果:即使一个实现将__STDC_NO_THREADS__定义为1,那么它仍然需要支持(至少接受)_Thread_local。我想这是一个缺陷。对吗?


UPD:C2x 相关提案:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2291.htm.

这是正确的,但不一定是缺陷

_Thread_local是随着C11的发布而添加到C编程语言中的存储持续时间,你是对的,它没有明确与threads.h库头文件相关联。它就像一个只对一个线程可见的static变量,这样每个线程都可以有自己的局部static-like变量。

__STDC_NO_THREADS__ 定义为 1 的符合标准的 C11 编译器不需要包含或支持 threads.h 中的函数或类型,但仍必须支持持续时间说明符 _Thread_local。这允许程序员使用 non-standard 线程库(例如 POSIX 标准 pthread.h 在 C 中编写 multi-threaded 程序,以声明 static-like 程序中特定线程的局部变量,即使所述编译器不支持 threads.h

正如您所指出的,当 __STDC_NO_THREADS__ 定义为 1 时,有人提议将其添加到不需要包含的事项列表中,但我想双方都会就其效用进行辩论对于旧的 longer-established 线程库,即使 C-standard threads.h 库还不受支持。

It seems that currently _Thread_local is independent from __STDC_NO_THREADS__.

是的。

Consequence: even if an implementation defines STDC_NO_THREADS to 1, then it still needs to support (at least to accept) _Thread_local.

是的。

I guess that it is a defect. Is that correct?

这不是缺陷。那里没有什么不一致,对于不支持 multi 线程识别和接受 _Thread_local 存储 class 说明符的 C 实现也没有特别的问题。在这样的实现中,线程存储持续时间和静态存储持续时间之间没有有意义的区别,因为每个程序的单个线程与程序本身具有相同的生命周期。 _Thread_local 几乎不会给此类实施的开发人员或供应商带来额外负担。

有人提议在 C2X 中支持可选的 _Thread_local 存储 class 说明符意义不大,我希望该提议不会被接受。我们不需要 C 语言中已有的更多可选特性,尤其是可选关键字或句法结构, _Thread_local 对不支持线程的实现没有影响。