C ++ 11 std :: chủ đề vs chủ đề posix


157

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ì?


5
Trong thực tế, bạn nên sử dụngstd::async
Stephan Dollberg

@bamboon đau khổ này từ những vấn đề tương tự như std::threadthực hiện
Gunther Piez

2
@hirschhornsalz từ chế độ xem hỗ trợ trình biên dịch, vâng. từ quan điểm kỹ thuật, nó cung cấp sự an toàn ngoại lệ, std::threadhoặc pthreadskhông.
Stephan Dollberg

15
Bình chọn để mở lại. Yêu cầu "khác biệt kỹ thuật" làm cho điều này có thể trả lời khách quan. Số phiếu cao cho thấy rằng những người khác đã tìm thấy bài đăng này mang tính xây dựng và hữu ích.
Adrian McCarthy

Câu trả lời:


120

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.


19
Bạn có bất cứ bằng chứng nào để sao lưu các yêu cầu "tắc nghẽn hiệu suất" này không? Ngoài ra, 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.
Jesse Tốt

9
Bây giờ trong năm 2014, câu trả lời này vẫn còn hiệu lực?
vô nghĩa

25
Còn bây giờ, đầu năm 2017 thì sao?
rmobis

9
Còn bây giờ, năm 2017 thì sao?
Các cuộc đua nhẹ nhàng trong quỹ đạo

14
Còn bây giờ, giữa năm 2018 thì sao?

59

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.


4
+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.
sbi

33

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.


2
thực tế, std :: thread cung cấp tính di động trên tất cả các nền tảng hỗ trợ C ++ 11, trong khi các luồng POSIX chỉ khả dụng trên các nền tảng POSIX (hoặc các nền tảng phấn đấu cho một số khả năng tương thích tối thiểu).
Tobias Langner

1
Từ POV thực tế điều này chỉ là sai. Tôi thực sự đã quyết định một vài tháng trước về lý do này - đó là một sai lầm lớn. Trong thực tế, bạn phải sử dụng 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.
Gunther Piez

1
@hirschhornsalz, quan điểm của câu trả lời của tôi là chỉ ra lợi ích của tính di động được cung cấp bởi việc triển khai luồng c ++ 11 so với pthread. OP không hỏi về boost, nhưng nó cũng di động.
Brady

3
@hirschhornsalz, đối với giọng điệu tiêu cực và lời buộc tội của bạn về việc không bao giờ sử dụng các chủ đề, chúng chỉ đơn giản là không gây khó chịu và không xứng đáng với nhiều nỗ lực từ phía tôi. Tôi nghĩ rằng ít nhất nó có giá trị trong khi đề cập rằng một nhận xét mang tính xây dựng hơn sẽ chỉ ra những rắc rối mà bạn đã cố gắng sử dụng std :: thread trên các nền tảng khác nhau.
Brady

3
Tóm lại, c ++ 11 std :: thread chỉ có thể sử dụng được với các phiên bản gần đây của GCC. Nó gần như không hoàn thành trong Visual Studio, do đó không thể sử dụng được trên Windows. Và tất nhiên nó hoàn toàn không có trong các trình biên dịch thương mại trên UNIX (Sun Studio trên Solaris, HP aCC trên HP-UX, IBM vacpp trên AIX). Do đó, nếu nền tảng đích của bạn chỉ là Linux - c ++ 11 std :: thread vẫn ổn; nếu bạn cũng cần Windows hoặc UNIX - thread :: thread là cách để đi.
vond

7

Đố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.


7
Tôi không đồng ý. Và việc sử dụng nhiều tín hiệu là một mẫu thiết kế có thể tránh được đối với hầu hết các ứng dụng.
Erik Alapää

Ngoài ra, std::threadmang lại sự an toàn kiểu mà pthread không có.
alfC

-3

OpenMP

http://www.openmp.org/

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.


6
Không thiếu tôn trọng, nhưng làm thế nào điều này có liên quan đến câu hỏi chính?
SRG
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.