Tại sao tôi nên thích cái này hay cái khác trong thực tế? Sự khác biệt kỹ thuật ngoại trừ đó std::thread
là một lớp học là gì?
std::thread
thực hiện
std::thread
hoặc pthreads
không.
Tại sao tôi nên thích cái này hay cái khác trong thực tế? Sự khác biệt kỹ thuật ngoại trừ đó std::thread
là một lớp học là gì?
std::thread
thực hiện
std::thread
hoặc pthreads
không.
Câu trả lời:
Nếu bạn muốn chạy mã trên nhiều nền tảng, hãy truy cập Posix Themes. Họ có sẵn ở hầu hết mọi nơi và khá trưởng thành. Mặt khác, nếu bạn chỉ sử dụng Linux / gccstd::thread
thì hoàn toàn ổn - nó có mức độ trừu tượng cao hơn, giao diện thực sự tốt và chơi độc đáo với các lớp C ++ 11 khác.
std::thread
Thật không may, lớp C ++ 11 không hoạt động đáng tin cậy (chưa) trên mọi nền tảng, ngay cả khi C ++ 11 dường như có sẵn. Ví dụ, trong Android std::thread
hoặc Win64, nó không hoạt động hoặc có các tắc nghẽn hiệu suất nghiêm trọng (tính đến năm 2012).
Một sự thay thế tốt là boost::thread
- nó rất giống với std::thread
(thực ra là từ cùng một tác giả) và hoạt động đáng tin cậy, nhưng, tất nhiên, nó giới thiệu một sự phụ thuộc khác từ thư viện của bên thứ ba.
Chỉnh sửa: Tính đến năm 2017, std::thread
chủ yếu hoạt động trên Android gốc. Một số lớp, như std::timed_mutex
vẫn chưa được thực hiện.
std::thread
và phong cách raii của nó là tốt bởi vì nó có thể xử lý các ngoại lệ C ++ trong khi pthreads không thể ra khỏi hộp.
Các std::thread
thư viện được thực hiện trên đầu trang của pthreads trong một môi trường hỗ trợ pthreads (ví dụ: libstdc ++).
Tôi nghĩ rằng sự khác biệt lớn giữa hai là trừu tượng. std::thread
là một thư viện lớp C ++. Các std::thread
thư viện bao gồm nhiều tính năng trừu tượng, ví dụ: ổ khóa scoped, mutexes đệ quy, tương lai / hứa hẹn triển khai mô hình thiết kế, và nhiều hơn nữa.
+1
từ tôi vì đã chỉ ra điều quan trọng nhất, đó là std :: thread mang đến mức độ trừu tượng cao hơn.
std::thread
cung cấp tính di động trên các nền tảng khác nhau như Windows, MacOS và Linux.
Như được đề cập bởi @hirshhornsalz trong các bình luận bên dưới và câu trả lời liên quan https://stackoverflow.com/a/13135425/1158895 , std::thread
có thể chưa hoàn tất trên tất cả các nền tảng. Thậm chí, (nó sẽ có trong tương lai gần) nó nên được ưa chuộng hơn pthread
bởi vì nó sẽ làm cho ứng dụng của bạn trở nên minh chứng hơn trong tương lai.
boost::thread
trên Win64 hoặc Bionic (Android), vì std::thread
vẫn còn thiếu các phần lớn, trong đó trên Linux std::thread
có vẻ khá trưởng thành.
Đối với tôi, sự khác biệt kỹ thuật quyết định là sự vắng mặt của các nguyên thủy xử lý tín hiệu trong std trái ngược với pthreads. Không thể ra lệnh xử lý tín hiệu một cách chính xác trong quy trình Unix chỉ sử dụng std là AFAIK là một lỗ hổng gây suy nhược trong việc sử dụng std :: thread khi nó ngăn không cho thiết lập mẫu xử lý tín hiệu đa luồng thực sự để xử lý tất cả các tín hiệu trong một tín hiệu chuyên dụng chủ đề và chặn chúng trong phần còn lại. Bạn buộc phải giả sử std :: thread được triển khai bằng pthreads và hy vọng điều tốt nhất khi sử dụng pthread_sigmask. Xử lý tín hiệu đúng cách là không thể thương lượng trong lập trình hệ thống Unix cho doanh nghiệp.
Như năm 2016, std :: thread là một món đồ chơi; đơn giản như vậy.
std::thread
mang lại sự an toàn kiểu mà pthread không có.
OpenMP
là một tiêu chuẩn đa luồng dựa trên SMP được tiêu chuẩn hóa, đã hoạt động trên Linux và Windows trong hơn một thập kỷ. OpenMP có sẵn theo mặc định với tất cả các trình biên dịch, bao gồm GCC và Microsoft Visual Studio.
Một điều cần chú ý, khi sử dụng OpenMP, là nếu có nhiều luồng hơn lõi CPU, thì hiệu suất sẽ giảm do chi phí liên quan đến chuyển đổi ngữ cảnh. Điều thứ hai cần lưu ý là việc khởi tạo một cấp độ hệ điều hành thực tế, tương đối đắt tiền. Việc khởi tạo là một phần của giây, nhưng trong một số ứng dụng, các phân số rất nhỏ tích lũy thành một chi phí đáng kể.
Đối với các yêu cầu kiến trúc phần mềm đồng thời liên quan đến kiến trúc phần mềm Bạn có thể muốn tìm kiếm một số triển khai "luồng nhẹ" hoặc "luồng xanh" thay vì sử dụng OpenMP. Sự khác biệt là các luồng OpenMP là thực tế, mức hệ điều hành, luồng, nhưng "luồng xanh" có thể chỉ là "luồng mô phỏng" được thực thi bằng cách sử dụng một số lượng nhỏ luồng thực.
std::async