2009-01-31 39 views
13

Đã làm chủ yếu là Java và smattering của .NET trong năm năm qua và đã không viết bất kỳ C hay C++ quan trọng nào trong thời gian đó. Vì vậy, đã được đi từ cảnh đó trong một thời gian.PThread có phải là lựa chọn tốt cho chương trình đa luồng đa luồng C/C++ không?

Nếu tôi muốn viết chương trình C hoặc C++ ngày hôm nay thực hiện một số luồng đa luồng và mã nguồn trên Windows, Mac OS X và Linux/Unix - PThread có phải là lựa chọn tốt không?

Mã C hoặc C++ sẽ không thực hiện bất kỳ GUI nào, do đó, bạn sẽ không cần phải lo lắng về bất kỳ điều gì trong số đó.

Đối với nền tảng Windows, tôi không muốn mang nhiều hành lý Unix, mặc dù, về các thư viện thời gian chạy thi đua unix. Muốn có một API PThread cho Windows là một trình bao bọc mỏng nhất có thể trên các API luồng Windows hiện có.

PHỤ LỤC EDIT:

Am nghiêng về phía đi với tăng: chủ đề - Tôi cũng muốn có thể sử dụng C++ try/catch ngoại lệ xử lý quá. Và mặc dù chương trình của tôi sẽ khá nhỏ và không phải là đặc biệt là OOPish, tôi thích đóng gói bằng cách sử dụng lớp và không gian tên - trái ngược với C chức năng bị xóa.

Trả lời

14

Vâng, pthreads là tiêu chuẩn posix cũ để viết các chương trình luồng. Của nó thấp nhất trình độ luồng thói quen, do đó, nó là một lựa chọn tốt cho cross-nền tảng luồng.

Tuy nhiên, có giải pháp thay thế:

  • boost::thread - một phong cách STL luồng thư viện
  • của Intel Thread Building Blocks
  • OpenMP - cả hai là một cách cấp cao của các ứng dụng luồng viết mà không cần để thực hiện bất kỳ cuộc gọi luồng nào.

Vì sau này được hỗ trợ đầy đủ trên tất cả nền tảng, (pthreads yêu cầu một chút cài đặt trình biên dịch là phần duy nhất của hệ thống phụ posix của Windows, trừ khi bạn muốn sử dụng Pthreads-w32) lựa chọn. boost :: threads giống như một thư viện luồng, 2 cái khác là cách thức cao cấp để đạt được tính song song mà không cần mã 'chủ đề', chúng cho phép bạn viết các vòng chạy đồng thời một cách tự động (tùy theo điều kiện thông thường)

Boost :: thread không phải là thư viện tương thích C.

chỉnh sửa: cross-platform khả năng của các bên trên:

Intel TBB is cross-platform (Windows *, Linux *, và Mac OS * X), ​​hỗ trợ các ứng dụng 32-bit và 64-bit và làm việc với các trình biên dịch Intel, Microsoft và GNU .

OpenMP phụ thuộc vào trình biên dịch bạn muốn sử dụng, nhưng GCC và/hoặc Intel compilers have supported OpenMP Windows, Linux và MacOS.

+0

"Như sau được hỗ trợ đầy đủ trên tất cả các nền tảng" - Nếu bởi tất cả các nền tảng bạn có nghĩa là Windows và một vài nền tảng * nix thì điều này là đúng. Khác hơn là nó không phải là. –

+0

xem chỉnh sửa của tôi. OP không bao giờ yêu cầu bất cứ điều gì khác ngoài 3 nền tảng đó. – gbjbaanb

+0

Tôi chấp nhận phản hồi này vì nó trình bày phạm vi thông tin rộng nhất về các cách có thể tiến hành. – RogerV

4

Không, pthreads thường không khả dụng trên Windows. (Có một vài nỗ lực khi triển khai nó, nhưng ít nhất nó không được hệ điều hành hỗ trợ, ít nhất.)

Nếu bạn đang viết C++, Tăng, như thường lệ, câu trả lời. Boost.Thread có một thư viện luồng di động (và an toàn hơn).

Trong C, giải pháp đơn giản nhất có lẽ là để bọc viết một trình bao bọc chung cho cả pthread và API luồng Windows.

11

Nếu bạn cần mã thực sự di động thì tốt nhất bạn nên tránh xa các thư viện khác nhau phân tán internet. Tại một số điểm bạn sẽ tìm thấy một nền tảng mà họ không hỗ trợ và sau đó sẽ phải tạo ra chi nhánh của riêng bạn.

Đây cũng không phải là vấn đề khó giải quyết và có thể là một bài tập tốt để tạo mã đa nền tảng.

Tôi khuyên bạn nên tạo một lớp học, ví dụ: CThread, có các triển khai .cpp riêng biệt cho mỗi nền tảng và một hàm pure-virtual pure() được gọi sau khi luồng của bạn được xây dựng/chạy.

Điều đó cho phép tất cả mã tạo luồng và mã ngủ/tắt/ưu tiên được triển khai bằng API thích hợp nhất cho nền tảng. Bạn cũng có thể cần tiêu đề (ví dụ: ThreadTypes.h) chứa định nghĩa/typedef cho mỗi nền tảng.

Ví dụ:

// ThreadTypes.h 
#if defined(PLATFORM_WIN) || defined(PLATFORM_XBOX) 
    typedef DWORD ThreadID 
#elif defined(PLATFORM_PS3) 
    // etc etc 
#endif 

Đây là cách tôi đã viết tất cả mã luồng đa nền tảng cho các nền tảng như PC/PS2/PS3/360/Wii. Nó cũng là một mô hình tốt để làm theo cho những thứ như mutex và Cột, mà nếu bạn có chủ đề bạn chắc chắn cần tại một số điểm :)

+0

Tôi thích điều đó - những người bỏ phiếu ẩn danh từ những người có khả năng không bao giờ gửi một ứng dụng trên nhiều nền tảng! FTW! –

+0

Hey Andrew, tôi đã đăng câu hỏi gốc. Có một chút ngạc nhiên khi thấy bạn đã bỏ phiếu quá.Tôi đã cuộn mỏng C + + lớp học trên Win32 luồng - Tôi chỉ cần trừu tượng rằng qua POSIX Pthreads quá và tôi muốn được thực hiện. Mặt khác, có Pthreads-win32. Mọi thứ khác đã có Pthread rồi. – RogerV

+0

+1: Đóng gói * luôn luôn * bạn của bạn. Nó có vẻ giống như công việc phụ, nhưng thời gian thêm tối thiểu đó cuối cùng sẽ tiết kiệm ass của bạn. Đặc biệt khi ai đó phá vỡ tiêu chuẩn và có các giá trị lỗi không mong muốn để kiểm tra. –

0

Tôi sẽ đặt cược vào ZThread

Simple API, dễ sử dụng hơn pthreads và miễn phí

+0

Bất kỳ ý tưởng nào tại sao tôi nhận được quá nhiều thư trên bảng điều khiển của mình khi sử dụng thư viện Zthread? Chẳng hạn như 'ThreadQueue created',' User thread created ', vv Có vẻ như đây là những thông điệp DEBUG từ thư viện, làm thế nào tôi có thể tắt chúng? – lqr