2013-06-21 41 views
68

Tôi đang cài đặt mingw-w64 trên Windows và có hai tùy chọn: chuỗi 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.chủ đề mingw-w64: posix vs win32

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 thấy điều này: Whats the difference between thread_posixs and thread_win32 in gcc port of windows?

Nói tóm lại, đối với phiên bản này của mingw, việc phát hành bài-posix sẽ sử dụng API posix và cho phép sử dụng std :: chủ đề, và đề-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 :: thread sẽ không khả dụng nhưng chủ đề win32 vẫn sẽ được sử dụng. Nhưng được sử dụng bởi những gì?

+0

Được sử dụng bởi các ứng dụng được tạo bằng cách sử dụng * this * gcc. – devnull

+0

@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

+0

gcc sẽ ngăn bạn, hay đúng hơn: trở nên không ổn định – jiggunjer

Trả lời

58

GCC đi kèm với thư viện thời gian chạy trình biên dịch (libgcc) mà nó sử dụng (trong số những thứ khác) cung cấp trừu tượng hệ điều hành mức thấp cho chức năng đa luồng liên quan bằng ngôn ngữ mà nó hỗ trợ. Ví dụ có liên quan nhất là C++ 11 <thread>, <mutex>, và <future>, không 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 (hoàn toàn NO ảnh hưởng đến API bạn có thể gọi trong mã của mình). Nó chỉ phản ánh thư viện runtime 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: enable C++ 11/C11 tính năng đa luồng. 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.

+5

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. –

+4

** Rất ** liên quan: http://stackoverflow.com/questions/37358856 –

+0

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 'x86_64-w64-mingw32-g ++ - win32' và' x86_64-w64-mingw32-g ++ - posix', và 'x86_64-w64-mingw32-g ++' được đặt tên cho một trong số chúng; xem 'các lựa chọn thay thế cập nhật - hiển thị x86_64-w64-mingw32-g ++'. – stewbasic

15

Các phần của thời gian chạy GCC (xử lý ngoại lệ, cụ thể) 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.

Thậm chí nếu 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ừ số MinGW FAQ:

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 chuỗi mới. Đặc biệt, chức năng CreateThread 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. Thay vào đó, bạn nên sử dụng _beginthreadex, nghĩa là (gần như) hoàn toàn tương thích với CreateThread.

+7

Trong trường hợp này, thư viện luồng thứ ba như tăng hoặc Qt thì sao? 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

+1

@ user460153 một số thông tin http://qt-project.org/wiki/MinGW-64-bit#03a4097f5708a02b5f19f72476b49adc –

+9

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

9

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