programing

c11에서의 멀티스레딩 지원

goodsources 2022. 8. 8. 20:06
반응형

c11에서의 멀티스레딩 지원

새로운 C11 규격은 멀티스레딩을 지원합니다.
나의 질문은 조금 다양하지만 확실히 대답할 수 있다.
C11 n1570 초안을 보았습니다.
다음과 같이 되어 있습니다.

향상된 메모리 시퀀싱 모델, 원자 객체 및 스레드 로컬 스토리지를 포함한 여러 스레드 실행 지원(<stdatomic.h>그리고.<threads.h>)

향상된 메모리 시퀀스 모델은 무엇입니까?c99 Standard와 달라진 점

표준에서 인용하는 것만으로 끝나는 것이 아니라, 그 의미를 깊이 파고들어 설명해 주셨으면 합니다.

C11은 다음을 지원합니다.

  • 스레드 작성 및 관리
  • 뮤텍스
  • 조건부 변수
  • 스레드 고유의 스토리지 및
  • 원자 객체

내가 놓친 게 없었으면 좋겠는데?
스탠다드 라이브러리 자체가 멀티스레딩에 필요한 모든 기능을 제공하고 있기 때문에 앞으로는 POSIX 및 그러한 라이브러리(멀티스레딩 지원용)가 필요없습니까?

마지막으로 위의 기능을 지원하는 컴파일러는 무엇입니까?언제 지원될 예정에 대한 참고 자료가 있습니까?
C++11에는 컴파일러 지원 및 기능에 대한 링크가 있었던 것으로 기억합니다만, 혹시 그런 것 같습니까?

첫째, C++11을 무시하지 마세요.새로운 표준에 대한 동시성 작업은 C++11 산하에 이루어졌으며 호환성을 목표로 C11에 Import되었다.구문적인 차이(예를 들어 템플릿이나 함수 오버로드가 없는 플레인 C로 인해)가 몇 가지 있지만, 의미론적으로 그것들은 설계상 동일합니다.이에 대한 "증거"는 WG14 문서를 확인할 수 있습니다.예:

참조할 수 있습니다.자세한 내용은 Open Std Web 사이트를 참조하십시오.

이제 질문을 드리겠습니다.

향상된 메모리 시퀀스 모델은 무엇입니까?

분명한 답은 여러 스레드와 스레드 간의 상호 작용을 고려하도록 변경되었다는 것입니다.조금 더 긴 답변에 대해서는 C++11에서 도입된 표준화된 메모리 모델을 참조하십시오. 무슨 뜻이죠? 그러면 C++ 프로그래밍에 어떤 영향을 미칠까요?댓글에 이미 언급이 되어있었어요.상세하게 이해하기 위해서는 스택 오버플로우 답변이 적절하지 않을 수 있습니다(하물며 여러 개의 서브질문이 있는 질문!).그러나 다행히 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동시성 지원에 대해서는 다음 URL에서 C++11 상태 페이지에서 동시성 지원을 확인할 수 있습니다.http://gcc.gnu.org/projects/cxx0x.htmlGCC의 현황과 계획에 대한 메모도 http://gcc.gnu.org/wiki/Atomic에 있습니다(이 페이지에 따르면 stdatomic.h를 이용할 수 있습니다).기타 컴파일러의 경우 다양한 컴파일러의 C++11 상태 목록이 http://www.aristeia.com/C++11/C++11FeatureAvailability.htm에 표시됩니다.이 링크에서 동시성 지원 상태를 확인할 수 있습니다.해당 벤더가 C11을 지원한다고 가정하면 C11 동시성 지원은 대략 에 있습니다.ame 레벨

에 관하여What compilers provide support for the above mentioned features?


Pelles C supports C11 <threads.h>. Creation of threads with Pelles C compiler example:

#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은 이미 많은 설명을 했다.마지막 질문입니다.

마지막으로 위의 기능을 지원하는 컴파일러는 무엇입니까?언제 지원될 예정에 대한 참고 자료가 있습니까?

gcc 계열의 컴파일러(clang, icc, opencc)는 새로운 표준이 요구하는 대부분의 의미론을 지원하며 구문적인 차이만 있을 뿐입니다.(장구도 달랑)_Generic최신 버전)을 참조해 주세요.

P99의 경우 대부분의 기능을 이미 C11 구문이거나 C11 구문에 가까운 것에 매핑하는 래퍼 매크로를 작성했습니다(에뮬레이트용)._Generic).

이러한 컴파일러 중 하나를 사용하고 POSIX 시스템 상에 있는 경우, 즉시 많은 C11을 사용할 수 있습니다.모든 타입의 스레드mtx_hetc, atomics와_Atomic범용 매크로를 입력합니다(구문은 C11과 약간 다릅니다)._Static_assert얼라인먼트 같은 거.

언급URL : https://stackoverflow.com/questions/8876043/multi-threading-support-in-c11

반응형