programing

mingw-w64 스레드: posix vs win32입니다.

javamemo 2023. 4. 25. 21:47
반응형

mingw-w64 스레드: posix vs win32입니다.

Windows에 mingw-w64를 설치하려고 하는데 win32 스레드와 posix 스레드의 두 가지 옵션이 있습니다.win32 스레드와 pthreads의 차이는 알지만 이 두 옵션의 차이는 잘 모르겠습니다.Posix 스레드를 선택하면 CreateThread와 같은 WinAPI 함수를 호출하지 못할 것 같습니다.

이 옵션은 일부 프로그램이나 라이브러리에서 사용할 스레드 API를 지정하는 것처럼 보이지만, 어떤 것에 의해 사용됩니까?GCC, libstdc++ 또는 다른 방법으로요?

이걸 찾았어요창의 gcc 포트에서 thread_posixs와 thread_win32의 차이점은 무엇입니까?

즉, 이 버전의 mingw의 경우 thread-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는 Winpthreads(Win32 멀티스레딩 API 위에 구현된 pthreads)를 제공하며 GCC는 이를 링크하여 모든 고급 기능을 사용할 수 있습니다.

이 옵션은 사용자가 원하는 코드를 작성하는 것을 금지하지 않습니다(코드에서 호출할 수 있는 API에 전혀 영향을 미치지 않음).GCC의 런타임 라이브러리(libgcc/libstdc++/...)만 반영됩니다.)을(를) 사용합니다.@James가 인용한 경고는 GCC의 내부 스레드화 모델과는 관계가 없으며 Microsoft의 CRT 구현과 관련이 있습니다.

요약하면 다음과 같습니다.

  • posix: C++11/C11 멀티스레딩 기능을 사용합니다.libgcc를 libwinpthreads에 종속시키므로 pthreads API를 직접 호출하지 않더라도 winpthreads DLL을 배포하게 됩니다.응용 프로그램에서 DLL을 하나 더 배포해도 문제가 없습니다.
  • win32: C++11 멀티스레딩 기능이 없습니다 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 런타임에 포함시키려는 시도가 있었던 것 같습니다.

@rubenvb 답변이 완전히 정확합니다 @rubenvb 답답 rub @ rub @ rub @ @ @ @ rub @ @ @ @ @ @ @ @ rub @ rub rubrub rub rub rub rub wrub w w w you pos mingw posix입니다.std::thread, , 입니다.std::mutexCMake를 사용하는 모든 사용자를 위한 예는 다음과 같습니다.

set(CMAKE_CXX_STANDARD 17) # or 20 if you want..
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)

set(TOOLCHAIN_PREFIX x86_64-w64-mingw32)

set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc-posix)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++-posix)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)

set(CMAKE_FIND_ROOT_PATH
  /usr/${TOOLCHAIN_PREFIX}
)

Linux 앱을 Windows로 교차 컴파일하는 데 이상적입니다.

힌트: GTK3를 사용하고 있으며 GTK 응용 프로그램을 Windows로 교차 컴파일하려는 사용자를 위한 것입니다.msys2.org에서 다운로드하여 패키징한 Mingw Windows GTK 번들을 다운로드하여 https://gitlab.melroy.org/melroy/gtk-3-bundle-for-windows를 이용하지 않아도 됩니다.

언급URL : https://stackoverflow.com/questions/17242516/mingw-w64-threads-posix-vs-win32 입니다.

반응형