mingw-w64 스레드 : posix 대 win32


128

Windows에 mingw-w64를 설치하고 있으며 win32 스레드와 posix 스레드의 두 가지 옵션이 있습니다. 나는 win32 스레드와 pthread의 차이점을 알고 있지만이 두 옵션의 차이점을 이해하지 못합니다. posix 스레드를 선택하면 CreateThread와 같은 WinAPI 함수를 호출하지 못할 것입니다.

이 옵션은 일부 프로그램이나 라이브러리에서 사용할 스레딩 API를 지정하는 것 같습니다. GCC, libstdc ++ 또는 다른 것으로?

나는 이것을 발견했다 : windows의 gcc 포트에서 thread_posixs와 thread_win32의 차이점은 무엇입니까?

요컨대,이 버전의 mingw에 대해 threads-posix 릴리스는 posix API를 사용하고 std :: thread 사용을 허용하며 threads-win32는 win32 API를 사용하고 std :: thread 부분을 비활성화합니다. 표준.

좋아, win32 스레드를 선택하면 std :: thread를 사용할 수 없지만 win32 스레드는 계속 사용됩니다. 그러나 무엇에 의해 사용됩니까?


gcc를 사용하여 만든 응용 프로그램에서 사용됩니다 .
devnull

@devnull, 이것이 내가 사용할 API에 의해 결정되지 않습니까? MinGW의 pthreads 버전을 선택하면 스레드에 WinAPI를 사용하지 못하게하는 것은 무엇입니까?
Simon

GCC는 당신을 방지, 또는 오히려됩니다 불안정해질
jiggunjer

답변:


123

GCC는 지원하는 언어로 멀티 스레딩 관련 기능을위한 저수준 OS 추상화를 제공하는 데 사용되는 컴파일러 런타임 라이브러리 (libgcc)와 함께 제공됩니다. 가장 관련성이 높은 예는 libstdc ++의 C ++ 11 <thread>, <mutex>및이며 <future>, GCC가 내부 Win32 스레딩 모델로 빌드 될 때 완전한 구현이 없습니다. MinGW-w64는 GCC가 모든 멋진 기능을 활성화하기 위해 링크 할 수있는 winpthreads (Win32 멀티 스레딩 API 위에 pthreads 구현)를 제공합니다.

이 옵션은 원하는 코드를 작성하는 것을 금지하지 않는다는 점을 강조해야합니다 ( 코드에서 호출 할 수있는 API에 절대적으로 영향을 미치지 않음 ). GCC의 런타임 라이브러리 (libgcc / libstdc ++ / ...)가 기능을 위해 사용하는 것만 반영합니다. @James가 인용 한주의 사항은 GCC의 내부 스레딩 모델과 관련이 없으며 오히려 Microsoft의 CRT 구현과 관련이 있습니다.

요약:

  • posix: C ++ 11 / C11 멀티 스레딩 기능을 활성화합니다. libgcc가 libwinpthreads에 종속되도록하므로 pthreads API를 직접 호출하지 않더라도 winpthreads DLL을 배포하게됩니다. 응용 프로그램과 함께 하나 이상의 DLL을 배포하는 데 아무런 문제가 없습니다.
  • win32: C ++ 11 멀티 스레딩 기능이 없습니다.

Win32 API 또는 pthreads API를 호출하는 사용자 코드에는 영향을 미치지 않습니다. 항상 둘 다 사용할 수 있습니다.


7
항상 gcc 런타임과 winpthread를 정적으로 링크하여 DLL 포함의 필요성을 제거 할 수 있습니다.
Alexander Shishenko

3
이 때문에 경우에 다른 사람 도움, 리눅스에서 해당 옵션을 찾을 걸 렸어요 : 패키지는 g++-mingw-w64-x86-64두 개의 파일을 제공 x86_64-w64-mingw32-g++-win32하고 x86_64-w64-mingw32-g++-posix, 그리고 x86_64-w64-mingw32-g++그들 중 하나에 별명이; 참조하십시오 update-alternatives --display x86_64-w64-mingw32-g++.
stewbasic

흠, "... GCC가 내부 Win32 스레딩 모델로 빌드 될 때 완전한 구현이 없습니다 .... MinGW-w64는 GCC가 수행 할 수있는 winpthreads (Win32 다중 스레딩 API 위에 pthreads 구현)를 제공합니다. 그런 다음 모든 멋진 기능을 활성화하려면 연결하십시오. " 그렇다면 win32 모델을 선택해도 GCC는 winpthread를 사용하기 때문에 모든 기능을 활성화 할 수 있습니까? 그러나 아래 글 머리 기호에는 "win32 : C ++ 11 멀티 스레딩 기능 없음"이라고 적었습니다. 이해가 안 돼요. "다음에 연결할 수있는 GCC ..."는 win32를 선택 하지 않으면 다음을 선택할 수 있음을 의미합니까?
Johannes Schaub-litb

@ JohannesSchaub-litb 글쎄, 아니. GCC의 구성 마법은 내부 스레드 모델 선택을 libstdc ++의 활성화 된 기능에 결합합니다. 후자는 GCC의 내부 "gthread"래퍼 (얇은 posix와 같은 스레드 추상화 일뿐입니다. C ++ 11 기능의 기본 부분이 누락 됨) 당신이 사용하는 층 --threads=win32. 누락 된 비트가 GCC에서 구현되지 않습니다 그래서 한, 당신은 함께 GCC를 구성해야합니다 --threads=win32.
rubenvb

-win32를 사용하는 qt의 mingw 사전 컴파일 된 라이브러리를 -posix를 사용하는 다른 라이브러리와 함께 사용할 수 있으며 동일한 프로그램에서 두 라이브러리를 모두 사용할 수 있습니까?
Johannes Schaub-litb

16

GCC 런타임의 일부 (특히 예외 처리)는 사용중인 스레딩 모델에 따라 다릅니다. 따라서 POSIX 스레드로 빌드 된 런타임 버전을 사용하고 있지만 Win32 API를 사용하여 자체 코드에 스레드를 생성하기로 결정한 경우 어느 시점에서 문제가 발생할 수 있습니다.

런타임의 Win32 스레딩 버전을 사용하는 경우에도 Win32 API를 직접 호출해서는 안됩니다. MinGW FAQ 에서 인용 :

MinGW는 Windows와 함께 제공되는 표준 Microsoft C 런타임 라이브러리를 사용하므로주의해야하며 올바른 함수를 사용하여 새 스레드를 생성해야합니다. 특히이 CreateThread함수는 C 런타임 라이브러리에 대해 스택을 올바르게 설정하지 않습니다. 당신은 사용해야합니다 _beginthreadex(거의)와 완벽하게 호환되는 대신 CreateThread.


7
이 경우 boost 또는 Qt와 같은 타사 스레딩 라이브러리는 어떻습니까? 이러한 라이브러리에 대한 기본 스레딩 라이브러리를 알아낼 필요없이 mingw64와 함께 이러한 라이브러리를 사용하는 방법이 있습니까? mingw의 posix 변형과 함께 boost :: threads를 임의로 사용하기로 결정하면 어떻게됩니까?
tantuni 2014 년

1
@ user460153 일부 정보 qt-project.org/wiki/...
알렉스 V.

10
이 대답은 틀 렸습니다. GCC 런타임은 Win32 API에 전혀 영향을 미치지 않습니다.
rubenvb

링크 된 FAQ 항목을 읽으십시오. 정답입니다.
Daira Hopwood

13

이제 win32 스레딩 모드에서 일부 C ++ 11 std :: thread를 사용할 수 있습니다. 이 헤더 전용 어댑터는 나를 위해 상자에서 즉시 작동했습니다. https://github.com/meganz/mingw-std-threads

개정 내역에서 최근에 이것을 mingw64 런타임의 일부로 만들려는 시도가 있었던 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.