Multi-Threading support in c11
新的C11标准支持多线程。我的问题有点多样化,但肯定是可以回答的。我看过C11N1570的草稿。它说:
support for multiple threads of execution including an improved memory sequencing
model, atomic objects, and thread-local storage (and )
什么是改进的内存排序模型?C99标准有何变化?
如果有人更深入地研究它们,并试图解释其中涉及的语义,我将非常感激,而不仅仅是引用标准。
据我所知,C11为以下各项提供支持:
- 线程创建和管理
- 互斥
- 条件变量
- 线程特定存储&;
- 原子对象
希望我没有错过什么?既然现在标准库本身提供(将提供)多线程所需的所有功能,那么将来就不需要POSIX和此类库(用于多线程支持)?
最后,哪些编译器为上述功能提供支持?是否有任何关于时间表的参考资料,当这些将被支持?我记得C++ 11有一个编译器支持和特性的链接,可能是这样的吗?
型
首先,不要注销C++ 11。新标准的并发工作是在C++ 11伞下完成的,然后导入到C11中,其目标是兼容的。虽然存在一些语法差异(例如,由于普通C没有模板或函数重载),但在语义上它们在设计上是相同的。对于这方面的"证据",我们可以查看WG14文件。例如:
- 百万千克1N1349百万千克1百万千克1N1423型百万千克1百万千克1N1424型百万千克1百万千克1N1437型百万千克1百万千克1N1479型百万千克1百万千克1N1480型百万千克1百万千克1N1489型百万千克1百万千克1N1584型百万千克1
型
以及其中的参考资料。更多信息请访问打开标准网站
现在,关于你的问题:
什么是改进的内存排序模型?
显而易见的答案是,它已经被更改为考虑多个线程及其交互方式。对于稍长的答案,见C++ 11引入了标准化内存模型。这是什么意思?它会如何影响C++程序设计?评论中已经提到了这一点。为了深入理解,stackoverflow答案可能不是正确的位置(更不用说有几个子问题的问题!)但幸运的是,Hans Boehm保持了一个非常好的页面,有有趣的链接用于进一步阅读(再次,记住C11和C++ 11个内存模型在语义上是相同的)。
希望我没有错过什么?
与内存模型一起,您的列表似乎涵盖了C11中的并发添加。对于其他的变化,维基百科有一个列表;在我的头上,我找不到维基百科列表遗漏的任何东西。
既然现在标准库本身提供(将提供)多线程所需的所有功能,那么将来就不需要POSIX和此类库(用于多线程支持)?
是的,我们需要它们。首先,没有人会重写所有使用各种现有线程API的现有代码。第二,C(++)11线程库很可能是/将被实现为各种本机线程库的包装;哎呀,甚至还有一种文档化的方法来检索指向底层本机线程的指针,以防需要执行某些操作。超出了C(++)线程库所支持的范围。想想C(++)11线程库,它更像是各种本机线程库周围的一个可移植的、最小公分母的包装器。
最后,哪些编译器为上述功能提供支持?是否有任何关于时间表的参考资料,当这些将被支持?我记得C++ 11有一个编译器支持和特性的链接,可能是这样的吗?
我还没有看到任何详细的列表,C11周围的嗡嗡声似乎不比C++ 11多。下面是即将到来的GCC4.7的简短通知:http://gcc.gnu.org/gcc-4.7/changes.html。对于并发支持,可以在这里的C++ 11状态页中检查并发支持:HTTP:/GCC.GNUGOR/PROSPECTS/CXX0X.HTML。在http://gcc.gnu.org/wiki/atomic(根据该页面,stdamico.h可用)上,还有一些关于gcc当前状态和计划的注释。对于其他编译器,有一个很好的列表,列出了各种编译器在这里的各种编译器:http://www. ARISTIA.COM/C++1/C++11ExtabyFabelaby.HTM。从那里的链接可以检查并发支持的状态,并且假设有问题的供应商计划支持C11,那么C11并发支持可能处于同一级别。
关于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <stdio.h> #include <threads.h> #define NUM_THREADS 7 static int threadData[NUM_THREADS]; int threadFunction(void * data) { printf("%d-th thread up ", *(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 ", i); return 0; } } // wait until all threads terminates for (int i=0; i < NUM_THREADS; ++i) thrd_join(threadId[i], NULL); return 0; } |
编辑:消除了线程共享数据问题和在所有线程终止之前退出
Janneb已经给出了很多解释。最后一个问题
Lastly, What compilers provide support for the above mentioned
features? Are there any references as to timelines when these will be
supported?
GCC编译器系列(clang、icc、opencc)支持新标准所需的大部分语义,只存在语法差异。(clang甚至在最新版本中实现了
对于P99,我已经编写了包装宏,它将大部分特性映射到已经是C11语法的东西,或者接近它(用于模拟
因此,如果您有一个这样的编译器,并且在POSIX系统上,您可以立即开始大量(大部分)使用C11:具有所有类型