C11中的多线程支持

新的 C11标准提供了对多线程的支持。
我的问题有点多样化,但绝对可以回答。
我看了一下 C11译自: 美国《科学》杂志网站(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)原著: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf的草稿。
上面写着:

支持多线程执行,包括改进的内存排序 模型、原子对象和线程本地存储(<stdatomic.h><threads.h>)

什么是 改进的内存排序模型? 与 c99标准有何不同?

如果有人能更深入地研究它们,并试图解释其中涉及的语义,我将不胜感激,而不仅仅是引用标准语言。

据我所知,C11为以下方面提供支持:

  • 线程创建和管理
  • 互斥
  • 条件变量
  • 线程特定存储 &
  • 原子物体

希望我没错过什么?
既然现在标准库本身提供(将提供)多线程所需的所有功能,那么将来就不再需要 POSIX 和类似的库(用于多线程支持)了吗?

最后,哪些编译器支持上述特性?是否有关于何时支持这些时间线的参考?
我记得对于 C + + 11,有一个关于编译器支持和特性的链接,也许是类似的东西?

40820 次浏览

首先,不要放弃 C + + 11。新标准的并发工作是在 C + + 11的保护伞下完成的,然后导入到 C11中,明确的目标是兼容。虽然存在一些语法上的差异(例如,由于普通的 C 语言没有模板或函数重载) ,但从语义上来说,它们在设计上是相同的。对于“证据”这一点,人们可以检查的 WG14文件。例如:

查阅详情,请浏览 开放性病网站

现在,回到你们的问题:

什么是改进的内存排序模型

The obvious answer is that it has been changed to take into account multiple threads and how they interact. For a slightly longer answer, see C + + 11引入了一个标准化的内存模型。这意味着什么? 它将如何影响 C + + 编程? that was already mentioned in the comments. For an in-depth understanding, a stackoverflow answer is perhaps not the right place (even less a question with several subquestions!). But luckily Hans Boehm 维护了一个非常好的页面,提供了有趣的链接以供进一步阅读 (again, keep in mind that the C11 and C++11 memory models are semantically identical)

我希望我没有错过什么

与内存模型一起,您的列表似乎涵盖了 C11中的并发添加。至于其他的修改,维基百科有一个列表; 在我的头顶上,我想不出任何维基百科列表遗漏的东西。

既然现在标准库本身提供(将提供)多线程所需的所有功能,那么将来就不再需要 POSIX 和类似的库(用于多线程支持)了吗?

是的,我们需要他们。首先,没有人会重写使用各种现有线程 API 的所有现有代码。其次,C (+ +)11线程库很可能是作为各种本机线程库的包装器实现的; 见鬼,甚至还有一种文档化的方法来检索底层本机线程的指针,以防需要做一些 C (+ +)线程库不支持的事情。可以将 C (+ +)11线程库看作是各种本机线程库周围的可移植的、最小公分母包装器。

最后,哪些编译器支持上述特性?是否有关于何时支持这些时间线的参考?我记得对于 C + + 11,有一个关于编译器支持和特性的链接,也许是类似的东西?

我没有看到任何详细的列表,似乎没有那么多的嗡嗡声围绕 C11相比,C + + 11。这里有一个关于即将到来的 GCC 4.7的简短通知: http://gcc.gnu.org/gcc-4.7/changes.html。对于并发性支持,可以在这里的 C + + 11状态页面中检查对并发性的支持: http://gcc.gnu.org/projects/cxx0x.html。在 http://gcc.gnu.org/wiki/Atomic上还有一些关于 GCC 当前状态和计划的说明(根据该页面,stdatomic.h 是可用的)。对于其他编译器,这里有一个针对各种编译器的 C + + 11状态列表 http://www.aristeia.com/C++11/C++11FeatureAvailability.htm。通过这些链接,我们可以检查并发支持的状态,假设有问题的供应商计划支持 C11,那么 C11并发支持可能处于大约相同的水平。

Janneb 已经给出了很多解释,关于你最后的问题

最后,编译器为上述内容提供了哪些支持 是否有任何关于时间线的参考,当这些将被 支持?

Gcc 编译器家族(clang、 icc、 opencc)支持新标准要求的大部分语义,只有语法上的差异。(clang 甚至在最新版本中实现了 _Generic。)

对于 P99,我已经编写了 包装宏,它将大部分特性映射到已经是 C11语法的东西,或者接近它(用于模拟 _Generic)。

因此,如果你有一个这样的编译器 还有在 POSIX 系统上,你可以立即开始使用很多(大部分) C11: 所有类型的线程 mtx_h等,原子与 _Atomic,类型泛型宏(语法与 C11略有不同) ,_Static_assert和对齐的东西。

关于 What compilers provide support for the above mentioned features?


Pelles C 支持 C11 <threads.h>。用 Pelles C编译器创建线程示例:

#include <stdio.h>
#include <threads.h>


#define NUM_THREADS 7


static int threadData[NUM_THREADS];


int threadFunction(void * data) {
printf("%d-th thread up\n", *(int*)data);
return 0;
}


int main(void) {
thrd_t threadId[NUM_THREADS];


// init thread data
for (int i=0; i < NUM_THREADS; ++i)
threadData[i] = i;


// start NUM_THREADS amount of threads
for (int i=0; i < NUM_THREADS; ++i) {
if (thrd_create(threadId+i, threadFunction, threadData+i) != thrd_success) {
printf("%d-th thread create error\n", i);
return 0;
}
}


// wait until all threads terminates
for (int i=0; i < NUM_THREADS; ++i)
thrd_join(threadId[i], NULL);


return 0;
}

EDIT : 消除了线程共享数据问题和在所有线程终止之前退出 main()的问题。