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::threadlà một lớp học là gì?
std::threadthực hiện
std::threadhoặc pthreadskhô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::threadlà một lớp học là gì?
std::threadthực hiện
std::threadhoặc pthreadskhô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::threadThậ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::threadhoặ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::threadchủ yếu hoạt động trên Android gốc. Một số lớp, như std::timed_mutexvẫn chưa được thực hiện.
std::threadvà 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::threadthư 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::threadlà một thư viện lớp C ++. Các std::threadthư 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.
+1từ 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::threadcó 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 pthreadbở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::threadtrên Win64 hoặc Bionic (Android), vì std::threadvẫn còn thiếu các phần lớn, trong đó trên Linux std::threadcó 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::threadmang 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