Alo*_*ave 68 c multithreading c11
新的C11标准提供了对多线程的支持.
我的问题有点多元化,但绝对是可以回答的.
我看过C11 n1570选秀.
它说:
支持多个执行线程,包括改进的内存排序模型,原子对象和线程局部存储(
<stdatomic.h>
和<threads.h>
)
什么是改进的内存排序模型?c99标准如何/有什么变化?
如果有人深入研究它们并尝试解释所涉及的语义,我将不胜感激.
据我了解,C11支持:
我希望我什么都不错过?
从现在开始,标准库本身提供(将提供)多线程所需的所有功能,将来不需要POSIX和这样的库(用于多线程支持)?
最后,哪些编译器为上述功能提供支持?当支持这些时,是否有关于时间表的参考?
我记得在C++ 11中有一个编译器支持和功能的链接,也许是这样的?
jan*_*neb 55
首先,不要注销C++ 11.新标准的并发工作是在C++ 11保护伞下完成的,然后导入C11,其明确目标是兼容.虽然存在一些语法上的差异(例如由于普通C没有模板或函数重载),但从语义上讲它们在设计上是相同的.对于"证据",可以查看WG14论文.例如:
和其中的参考.更多信息可以在Open Std网站上找到
现在,问你的问题:
什么是改进的内存排序模型?
显而易见的答案是它已被更改为考虑多个线程以及它们如何交互.有关稍长的答案,请参阅C++ 11引入的标准化内存模型.这是什么意思?它将如何影响C++编程?已经在评论中提到过了.为了深入理解,stackoverflow答案可能不是正确的地方(更不用说有几个子问题!).但幸运的是Hans Boehm维护了一个非常好的页面,其中包含有趣的链接以供进一步阅读(同样,请记住,C11和C++ 11内存模型在语义上是相同的)
我希望我什么都不错过?
与内存模型一起,您的列表似乎涵盖了C11中的并发性添加.对于其他更改,维基百科有一个列表 ; 在我的头脑中,我无法想出维基百科列表遗漏的任何内容.
从现在开始,标准库本身提供(将提供)多线程所需的所有功能,将来不需要POSIX和这样的库(用于多线程支持)?
是的,他们需要.首先,没有人会重写使用各种现有线程API的所有现有代码.其次,C(++)11线程库最有可能被实现为各种本机线程库的包装器; 哎呀,甚至还有一种记录方法来检索指向底层本机线程的指针,以防万一需要做一些超出C(++)线程库支持的东西.可以想象C(++)11线程库更像是各种本机线程库的可移植,最不常见的分母包装器.
最后,哪些编译器为上述功能提供支持?当支持这些时,是否有关于时间表的参考?我记得在C++ 11中有一个编译器支持和功能的链接,也许是这样的?
我没有看到任何详细列表,与C++ 11相比,C11似乎没有那么多的嗡嗡声.即将到来的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并发支持可能大致处于同一级别.
关于 What compilers provide support for the above mentioned features?
<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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:消除线程共享数据问题和从main()
早于所有线程退出的问题终止.
归档时间: |
|
查看次数: |
34824 次 |
最近记录: |