programing

c11의 멀티 스레딩 지원

nasanasas 2020. 11. 12. 08:19
반응형

c11의 멀티 스레딩 지원


새로운 C11 표준은 멀티 스레딩을 지원합니다.
내 질문은 조금 다양하지만 확실히 대답 할 수 있습니다.
C11 n1570 초안을 살펴 보았습니다 .
그것은 말한다 :

개선 된 메모리 시퀀싱 모델, 원자 객체 및 스레드 로컬 저장소 ( <stdatomic.h><threads.h>)를 포함한 다중 실행 스레드 지원

향상된 메모리 시퀀싱 모델 이란 무엇입니까 ? c99 표준에서 어떻게 / 무엇이 변경됩니까?

표준에서 인용하는 것보다 누군가가 더 깊이 파고 들어 관련 의미를 설명해 주시면 감사하겠습니다.

내가 이해하는 바와 같이 C11은 다음에 대한 지원을 제공합니다.

  • 스레드 생성 및 관리
  • 뮤텍스
  • 조건부 변수
  • 스레드 별 스토리지 및
  • 원자 객체

내가 아무것도 놓치지 않았 으면 좋겠어?
이제 Standard 라이브러리 자체가 Multi-Threading에 필요한 모든 기능을 제공 (제공)하므로 POSIX 및 이러한 라이브러리 (Multi-Threading 지원용)가 향후 필요하지 않을까요?

마지막으로, 위에서 언급 한 기능을 지원하는 컴파일러는 무엇입니까? 지원되는 일정에 대한 언급이 있습니까?
C ++ 11에는 컴파일러 지원 및 기능에 대한 링크가 있었는지 기억합니다.


첫째, C ++ 11을 작성하지 마십시오. 새로운 표준에 대한 동시성 작업은 C ++ 11 우산 하에서 수행 된 다음 호환성이라는 명시적인 목표로 C11로 가져 왔습니다. (예를 들어 템플릿이나 함수 오버로딩이없는 일반 C로 인해) 일부 구문상의 차이가 있지만 의미 상 설계 상 동일합니다. 이에 대한 "증거"를 위해 WG14 논문을 확인할 수 있습니다. 예 :

및 그 안의 참조. 더 많은 정보는 Open Std 웹 사이트 에서 찾을 수 있습니다.

이제 귀하의 질문에 대해 :

향상된 메모리 시퀀싱 모델이란 무엇입니까?

분명한 대답은 다중 스레드와 이들이 상호 작용하는 방식을 고려하도록 변경되었다는 것입니다. 약간 더 긴 답변은 C ++ 11에서 표준화 된 메모리 모델 도입을 참조하세요 . 무슨 뜻이에요? 그리고 그것이 C ++ 프로그래밍에 어떤 영향을 미칠까요? 그것은 이미 코멘트에서 언급되었습니다. 심층적 인 이해를 위해 stackoverflow 답변은 올바른 장소가 아닐 수 있습니다 (여러 하위 질문이있는 질문은 적습니다!). 그러나 운 좋게도 Hans Boehm은 추가 읽기를위한 흥미로운 링크가있는 아주 좋은 페이지를 유지합니다 (다시 말하지만 C11 및 C ++ 11 메모리 모델은 의미 상 동일 함)

내가 아무것도 놓치지 않았 으면 좋겠어?

메모리 모델과 함께 목록은 C11의 동시성 추가를 다루는 것 같습니다. 다른 변경 사항에 대해서는 wikipedia에 목록이 있습니다 . 위키피디아 목록에서 놓친 내용을 찾을 수 없습니다.

이제 Standard 라이브러리 자체가 Multi-Threading에 필요한 모든 기능을 제공 (제공)하므로 POSIX 및 이러한 라이브러리 (Multi-Threading 지원용)가 향후 필요하지 않을까요?

예, 그들에 대한 필요가있을 것입니다. 첫째, 아무도 기존의 다양한 스레드 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?


Pelles C는 C11을 지원합니다 <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;
}

편집 : 스레드 공유 데이터 문제를 제거하고 main()모든 스레드보다 일찍 종료하는 문제가 종료 됩니다.


Janneb은 이미 많은 설명을했습니다. 마지막 질문

마지막으로, 위에서 언급 한 기능을 지원하는 컴파일러는 무엇입니까? 지원되는 일정에 대한 언급이 있습니까?

The gcc family of compilers (clang, icc, opencc) supports most of the semantics that the new standard requires, there are only syntactical differences. (clang even implements _Generic in the latest version.)

For P99 I have written wrapper macros that map most of the features to something that is already C11 syntax, or comes close to it (for emulating _Generic).

So if you have one of these compilers and are on a POSIX system, you can start to use a lot (most) of C11 immediately: threads with all the types mtx_h etc, atomics with _Atomic, type generic macros (syntax is slightly different from C11), _Static_assert and the alignment stuff.

참고URL : https://stackoverflow.com/questions/8876043/multi-threading-support-in-c11

반응형