关于C#:c11中的多线程支持

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并发支持可能处于同一级别。


关于What compilers provide support for the above mentioned features?。Pelles C支持C11 。使用Pelles C编译器创建线程示例:

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;
}

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


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甚至在最新版本中实现了_Generic。)

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

因此,如果您有一个这样的编译器,并且在POSIX系统上,您可以立即开始大量(大部分)使用C11:具有所有类型mtx_h等的线程、具有_Atomic的原子、键入通用宏(语法与c11稍有不同)、_Static_assert和对齐工具。