multithreading支持c11

新的C11标准提供了对multithreading的支持。
我的问题有点多样化,但绝对是可以回答的。
我看了一下C11 n1570草案。
它说:

支持multithreading执行,包括改进的内存sorting模型,primefaces对象和线程本地存储( <stdatomic.h><threads.h>

什么是改进的内存sorting模型 ? c99标准有哪些变化?

如果有人深入研究并试图解释所涉及的语义,我将不胜感激。

据我所知,C11提供了对以下方面的支持:

  • 线程创build和pipe理
  • 互斥
  • 有条件的variables
  • 线程特定存储&
  • primefaces对象

我希望我没有错过任何东西?
从现在开始,标准库自身提供(将提供)multithreading所需的所有function,将来就不需要POSIX和这样的库(用于multithreading支持)。

最后,什么编译器提供对上述function的支持? 是否有任何时间表提及这些将被支持?
我记得C ++ 11有一个编译器支持和function的链接,也许是这样的?

首先,不要注销C ++ 11。 新标准的并发工作是在C ++ 11的基础上完成的,然后导入到C11中,目的是兼容。 尽pipe存在一些语法差异(例如,由于普通的C没有模板或函数重载),从语义上讲,它们在devise上是相同的。 对于这个“证据”,可以检查WG14文件。 例如:

  • n1349
  • n1423
  • n1424
  • n1437
  • n1479
  • n1480
  • n1489
  • n1584

和其中的参考。 更多可以在Open Std网站find

现在,在你的问题上:

什么是改进的内存sorting模型?

显而易见的答案是已经改变了考虑多个线程以及它们如何相互作用。 对于稍长的答案,请参阅C ++ 11引入了一个标准化的内存模型。 这是什么意思? 那么如何影响C ++编程呢? 这在评论中已经提到过了。 为了深入理解,一个stackoverflow的答案可能不是正确的地方(甚至更less的几个子问题的问题!)。 但幸运的是, Hans Boehm保留了一个非常好的页面,并提供了一些有趣的链接,以便进一步阅读 (请记住,C11和C ++ 11的内存模型在语义上是相同的)

我希望我没有错过任何东西?

与内存模型一起,您的列表似乎涵盖了C11中的并发添加。 对于其他更改, 维基百科有一个列表 ; 我的头顶我不能拿出任何维基百科名单已经错过了。

从现在开始,标准库自身提供(将提供)multithreading所需的所有function,将来就不需要POSIX和这样的库(用于multithreading支持)。

是的,他们会有需要的。 首先,没有人会重写所有使用各种现有线程API的现有代码。 其次,C(++)11线程库很可能被实现为各种本地线程库的包装; 嘿,甚至有一个文档化的方式来检索一个指向底层本地线程的指针,以防需要做一些超出C(++)线程库支持的东西。 将C(++)11线程库看作是围绕各种本地线程库的可移植,最不常见的包容器。

最后,什么编译器提供对上述function的支持? 是否有任何时间表提及这些将被支持? 我记得C ++ 11有一个编译器支持和function的链接,也许是这样的?

我还没有看到任何详细清单,与C ++ 11相比,似乎并没有像C11那样引起轰动。 这里有一个即将到来的GCC 4.7的简短通知: http : //gcc.gnu.org/gcc-4.7/changes.html 。 对于并发支持,可以在这里检查C ++ 11状态页面中对并发的支持: http : //gcc.gnu.org/projects/cxx0x.html 。 还有一些关于GCC的现状和计划的说明, url是http://gcc.gnu.org/wiki/Atomic (根据该页面,stdatomic.h可用)。 对于其他编译器,这里有各种编译器的C ++ 11状态列表。http://www.aristeia.com/C++11/C++11FeatureAvailability.htm 。 从链接可以检查并发支持的状态,并假定有问题的供应商计划支持C11,那么C11并发支持可能处于大致相同的水平。

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


Pelles C支持C11 <threads.h> 。 用Pelles C创build线程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; } 

编辑 :消除线程共享数据问题和退出main()早于所有线程终止的问题。

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

最后,什么编译器提供对上述function的支持? 是否有任何时间表提及这些将被支持?

gcc系列编译器(clang,icc,opencc)支持新标准所需的大部分语义,只有语法上的差异。 (铛甚至在最新版本中实现了_Generic 。)

对于P99,我已经编写了包装macros ,它将大多数特征映射到已经是C11语法的东西,或者接近它(用于仿真_Generic )。

所以,如果你有这些编译器之一, 在POSIX系统上,你可以立即开始使用很多(大部分)的C11:所有types的线程mtx_h等,primefaces与_Atomic,typesgenericsmacros(语法略有不同C11), _Static_assert和alignment的东西。