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的东西。