Câu hỏi chủ đề mingw-w64: posix vs win32


Tôi đang cài đặt mingw-w64 trên Windows và có hai tùy chọn: chủ đề win32 và chuỗi posix. Tôi biết sự khác biệt giữa chủ đề win32 và pthreads nhưng tôi không hiểu sự khác biệt giữa hai tùy chọn này là gì. Tôi nghi ngờ rằng nếu tôi sẽ chọn chủ đề posix nó sẽ ngăn cản tôi gọi các chức năng WinAPI như CreateThread.

Dường như tùy chọn này chỉ định API luồng nào sẽ được một số chương trình hoặc thư viện sử dụng, nhưng bằng cách nào? Bởi GCC, libstdc ++ hoặc bởi cái gì khác?

Tôi đã tìm thấy cái này: Whats sự khác biệt giữa thread_posixs và thread_win32 trong cổng gcc của windows?

Tóm lại, đối với phiên bản này của mingw, phát hành thread-posix sẽ sử dụng API posix và cho phép sử dụng std :: thread và thread-win32 sẽ sử dụng API win32 và vô hiệu hóa phần std :: thread của Tiêu chuẩn.

Ok, nếu tôi sẽ chọn chủ đề win32 sau đó std :: thread sẽ không có sẵn nhưng chủ đề win32 vẫn sẽ được sử dụng. Nhưng được sử dụng bởi những gì?


76
2018-06-21 19:01


gốc


Được sử dụng bởi các ứng dụng được tạo bằng điều này gcc. - devnull
@ devnull, điều này có được xác định bởi API mà tôi sẽ sử dụng không? Nếu tôi sẽ chọn phiên bản pthreads của MinGW, thì điều gì sẽ ngăn cản tôi sử dụng WinAPI cho các chủ đề? - Simon
gcc sẽ ngăn cản bạn, hay đúng hơn là: trở nên không ổn định - jiggunjer


Các câu trả lời:


GCC đi kèm với một thư viện thời gian chạy trình biên dịch (libgcc) mà nó sử dụng cho (trong số những thứ khác) cung cấp một trừu tượng hệ điều hành mức thấp cho chức năng đa luồng liên quan trong các ngôn ngữ mà nó hỗ trợ. Ví dụ phù hợp nhất là C ++ 11 của libstdc ++ <thread>, <mutex><future>, mà không có một thực hiện đầy đủ khi GCC được xây dựng với mô hình luồng Win32 nội bộ của nó. MinGW-w64 cung cấp một winpthreads (một pthreads thực hiện trên đầu trang của đa luồng Win32 API) mà GCC sau đó có thể liên kết trong để cho phép tất cả các tính năng ưa thích.

Tôi phải nhấn mạnh tùy chọn này không cấm bạn viết bất kỳ mã nào bạn muốn (nó đã hoàn toàn KHÔNG ảnh hưởng đến API nào bạn có thể gọi trong mã của mình). Nó chỉ phản ánh những thư viện thời gian chạy của GCC (libgcc / libstdc ++ / ...) sử dụng cho chức năng của chúng. Lời cảnh báo được trích dẫn bởi @James không liên quan gì đến mô hình luồng nội bộ của GCC, mà đúng hơn là với việc triển khai CRT của Microsoft.

Tóm tắt:

  • posix: bật tính năng đa luồng C ++ 11 / C11. Làm cho libgcc phụ thuộc vào libwinpthreads, vì vậy mà ngay cả khi bạn không trực tiếp gọi pthreads API, bạn sẽ phân phối các winpthreads DLL. Không có gì sai khi phân phối thêm một DLL với ứng dụng của bạn.
  • win32: Không có tính năng đa luồng C ++ 11.

Không ảnh hưởng đến bất kỳ mã người dùng nào gọi API Win32 hoặc API pthreads. Bạn luôn có thể sử dụng cả hai.


65
2018-05-22 07:00



Bạn luôn có thể liên kết thời gian chạy gcc và winpthreads tĩnh, loại bỏ sự cần thiết của DLL bao gồm. - Alexander Shishenko
Rất có liên quan: stackoverflow.com/questions/37358856 - Marc.2377
Tôi mất một lúc để tìm tùy chọn tương ứng trên Linux, vì vậy trong trường hợp nó giúp người khác: Gói g++-mingw-w64-x86-64 cung cấp hai tập tin x86_64-w64-mingw32-g++-win32 và x86_64-w64-mingw32-g++-posixvà x86_64-w64-mingw32-g++ được đặt bí danh cho một trong số chúng; xem update-alternatives --display x86_64-w64-mingw32-g++. - stewbasic


Các bộ phận của thời gian chạy GCC (xử lý ngoại lệ, đặc biệt) phụ thuộc vào mô hình luồng đang được sử dụng. Vì vậy, nếu bạn đang sử dụng phiên bản thời gian chạy được xây dựng với các chủ đề POSIX, nhưng quyết định tạo các luồng trong mã của riêng bạn bằng các API Win32, bạn có thể gặp vấn đề tại một số điểm.

Ngay cả khi bạn đang sử dụng phiên bản luồng Win32 của thời gian chạy, bạn có thể không nên gọi trực tiếp các API Win32. Trích dẫn từ Câu hỏi thường gặp về MinGW:

Vì MinGW sử dụng thư viện thời gian chạy Microsoft C chuẩn đi kèm với Windows, bạn nên cẩn thận và sử dụng đúng chức năng để tạo một chuỗi mới. Đặc biệt, CreateThreadchức năng sẽ không thiết lập ngăn xếp chính xác cho thư viện thời gian chạy C. Bạn nên sử dụng _beginthreadex thay vào đó, đó là (gần như) hoàn toàn tương thích với CreateThread.


15
2018-06-22 19:13



Trong trường hợp này, những gì về các thư viện luồng bên thứ 3 như tăng hoặc Qt? Có cách nào yo sử dụng các thư viện với mingw64 mà không cần phải tìm ra thư viện luồng cơ bản cho những? Điều gì sẽ xảy ra nếu tôi tự ý quyết định sử dụng boost :: threads với biến thể posix của mingw? - tantuni
@ user460153 một số thông tin qt-project.org/wiki/… - Alex V.
Câu trả lời này là sai. Thời gian chạy GCC hoàn toàn không ảnh hưởng đến các API Win32. - rubenvb


Lưu ý rằng bây giờ có thể sử dụng một số C ++ 11 std :: thread trong chế độ luồng win32. Các bộ điều hợp chỉ tiêu đề này làm việc ra khỏi hộp cho tôi: https://github.com/meganz/mingw-std-threads

Từ lịch sử sửa đổi, có vẻ như có một số nỗ lực gần đây để biến nó trở thành một phần của thời gian chạy mingw64.


10
2017-09-19 15:32