[windows] mingw-w64 스레드 : posix 대 win32

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는 지원하는 언어로 멀티 스레딩 관련 기능을위한 저수준 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를 호출하는 사용자 코드에는 영향을 미치지 않습니다. 항상 둘 다 사용할 수 있습니다.


답변

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

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

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


답변

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

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


답변