Chủ đề mingw-w64: posix vs win32


128

Tôi đang cài đặt mingw-w64 trên Windows và có hai tùy chọn: chuỗi win32 và chuỗi posix. Tôi biết sự khác biệt giữa chủ đề win32 và pthreads là gì 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 chọn các chủ đề posix, nó sẽ ngăn tôi gọi các hàm WinAPI như CreateThread.

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

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

Tóm lại, đối với phiên bản mingw này, bản 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 chọn chủ đề win32 thì std :: chủ đề sẽ không khả dụng nhưng chủ đề win32 sẽ vẫn được sử dụng. Nhưng được sử dụng bởi những gì?


Được sử dụng bởi các ứng dụng được tạo bằng gcc này .
devnull

@devnull, điều này không được xác định bởi API mà tôi sẽ sử dụng? Nếu tôi chọn phiên bản pthreads của MinGW, thì điều gì sẽ ngăn tôi sử dụng WinAPI cho các luồng?
Simon

gcc sẽ khiến bạn không, hay đúng hơn: trở thành không ổn định
jiggunjer

Câu trả lời:


123

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 hệ điều hành trừu tượng mức thấp cho chức năng liên quan đến đa luồng bằng các ngôn ngữ mà nó hỗ trợ. Ví dụ phù hợp nhất là libstdc ++ 's C ++ 11 <thread>, <mutex><future>, mà không có một thực hiện đầy đủ khi GCC được xây dựng với nội mô hình luồng Win32 của nó. MinGW-w64 cung cấp một winpthreads (một triển khai pthreads trên API đa luồng Win32) mà GCC sau đó có thể liên kết để kích hoạt tất cả các tính năng ưa thích.

Tôi phải nhấn mạnh rằng 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 bạn có thể gọi trong mã của mình). Nó chỉ phản ánh những gì các 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 @James trích dẫn không liên quan gì đến mô hình phân luồng nội bộ của GCC, mà là với việc triển khai CRT của Microsoft.

Tóm lại:

  • posix: kích hoạt tính năng đa luồng của C ++ 11 / C11. Làm cho libgcc phụ thuộc vào libwinpthreads, vì vậy ngay cả khi bạn không gọi trực tiếp API pthreads, bạn sẽ phân phối 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.


7
Bạn luôn có thể liên kết tĩnh thời gian chạy gcc và winpthreads, loại bỏ sự cần thiết của việc đưa vào DLL.
Alexander Shishenko

3
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 ích cho người khác: Gói g++-mingw-w64-x86-64cung cấp hai tệp x86_64-w64-mingw32-g++-win32x86_64-w64-mingw32-g++-posixx86_64-w64-mingw32-g++được đặt bí danh cho một trong số chúng; xem update-alternatives --display x86_64-w64-mingw32-g++.
món hầm

Rất tiếc, bạn nói "... không có triển khai hoàn chỉnh khi GCC được xây dựng với mô hình phân luồng Win32 nội bộ của nó .... MinGW-w64 cung cấp một winpthreads (một triển khai pthreads trên API đa luồng Win32) mà GCC có thể sau đó liên kết vào để kích hoạt tất cả các tính năng ưa thích. " Vì vậy, nếu tôi chọn mô hình win32, GCC vẫn có thể kích hoạt tất cả các tính năng, vì nó sử dụng winpthreads? Nhưng trong gạch đầu dòng bên dưới, bạn viết "win32: Không có tính năng đa luồng C ++ 11". Tôi không hiểu. Liệu "GCC nào sau đó có thể liên kết đến ..." có nghĩa là nếu tôi không chọn win32, thì nó có thể chọn ...?
Johannes Schaub - litb

@ JohannesSchaub-litb Chà, không. Phép thuật cấu hình của GCC kết hợp lựa chọn mô hình luồng nội bộ với các tính năng được kích hoạt của libstdc ++ do mô hình này được xây dựng trên đầu trình bao bọc "gthread" nội bộ của GCC (chỉ là một phần tóm tắt chủ đề mỏng như posix. Các phần cơ bản cho các tính năng C ++ 11 bị thiếu trong lớp rằng khi bạn sử dụng --threads=win32. vì vậy, miễn là các bit mất tích không được thực hiện trong GCC, bạn phải cấu hình GCC với --threads=win32.
rubenvb

Tôi có thể sử dụng các thư viện được biên dịch trước mingw của qt, sử dụng -win32, với các thư viện khác sử dụng -posix và sử dụng cả hai thư viện trong cùng một chương trình không?
Johannes Schaub -

16

Các phần của thời gian chạy GCC (đặc biệt là xử lý ngoại lệ) 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 bằng các luồng POSIX, nhưng lại quyết định tạo các luồng trong mã của riêng bạn với các API Win32, bạn có thể gặp sự cố tại một số điểm.

Ngay cả khi bạn đang sử dụng phiên bản phâ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 tiêu 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 luồng mới. Đặc biệt, CreateThreadhàm 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. _beginthreadexThay vào đó, bạn nên sử dụng (gần như) hoàn toàn tương thích với CreateThread.


7
Trong trường hợp này, các thư viện luồng của bên thứ 3 như boost hoặc Qt thì sao? Có cách nào bạn sử dụng các thư viện này với mingw64 mà không cần phải tìm ra thư viện luồng cơ bản cho các thư viện này không? Điều gì sẽ xảy ra nếu tôi tự ý quyết định sử dụng boost :: thread với biến thể posix của mingw?
tantuni

1
@ user460153 một số thông tin qt-project.org/wiki/...
Alex V.

10
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

Đọc mục Câu hỏi thường gặp được liên kết. Câu trả lời này là chính xác.
Daira Hopwood

13

Lưu ý rằng bây giờ có thể sử dụng một số C ++ 11 std :: thread trong chế độ phân luồng win32. Các bộ điều hợp chỉ dành cho tiêu đề này hoạt động hiệu quả đối với 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 điều này thành một phần của thời gian chạy mingw64.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.