Có một vài điểm quan trọng mà tôi tin rằng nên được thêm vào câu trả lời tuyệt vời của @ Jason.
Đầu tiên, đa luồng không phải lúc nào cũng là ảo ảnh ngay cả trên một bộ xử lý đơn lẻ - có các thao tác không liên quan đến bộ xử lý. Đây là chủ yếu I/O - đĩa, mạng, thiết bị đầu cuối, vv Các hình thức cơ bản cho các hoạt động như vậy là chặn hoặc đồng bộ, ví dụ: chương trình của bạn chờ đợi cho đến khi hoạt động được hoàn thành và sau đó tiến hành. Trong khi chờ đợi, CPU được chuyển sang một tiến trình/luồng khác.
nếu bạn có bất cứ điều gì bạn có thể làm trong thời gian đó (ví dụ như tính toán nền trong khi chờ đợi cho người dùng nhập vào, phục vụ yêu cầu khác vv), bạn có về cơ bản hai lựa chọn:
sử dụng không đồng bộ I/O : bạn gọi số không chặn I/O cung cấp chức năng gọi lại , cho biết "gọi chức năng này khi bạn hoàn tất". Cuộc gọi trả về ngay lập tức và thao tác I/O tiếp tục ở chế độ nền. Bạn tiếp tục với những thứ khác.
sử dụng đa luồng: bạn có một chuỗi chuyên dụng cho từng loại tác vụ. Trong khi một người chờ cuộc gọi I/O chặn, người kia tiếp tục.
Cả hai phương pháp tiếp cận đều là mô hình lập trình khó, mỗi phương pháp đều có ưu và nhược điểm riêng.
- với async I/O logic của logic của chương trình ít rõ ràng và khó theo dõi và gỡ lỗi. Tuy nhiên, bạn tránh sự cố an toàn chủ đề.
- với chủ đề, challange là viết thread-safe chương trình. Lỗi an toàn chủ đề là những lỗi khó chịu gây ra khá khó khăn. Việc sử dụng quá mức khóa thực sự có thể dẫn đến sự xuống cấp thay vì cải thiện hiệu suất.
(đến đa xử lý)
Multithreading được phổ biến trên Windows vì thao túng quá trình khá nặng trên Windows (tạo ra một quá trình, bối cảnh chuyển đổi vv) như trái ngược với chủ đề mà được nhiều hơn nữa nhẹ (ít nhất đây là trường hợp khi tôi làm việc trên Win2K).
Trên Linux/Unix, các quy trình có trọng lượng nhẹ hơn nhiều. Ngoài ra (AFAIK) chủ đề trên Linux được thực hiện thực sự như là một loại quy trình nội bộ, do đó, không có được trong bối cảnh chuyển đổi của chủ đề so với quá trình. Tuy nhiên, bạn cần sử dụng một số hình thức IPC (liên lạc quy trình), như bộ nhớ chia sẻ, đường ống, hàng đợi tin nhắn, v.v.
Ghi chú: "Chủ đề là xấu"!:)
Trong máy đa xử lý sử dụng thư viện chuỗi như tăng cường sẽ tận dụng lợi thế của các lõi khả dụng. Bạn cũng có thể có nhiều luồng trên một bộ xử lý có thể xen kẽ với các công nghệ như siêu phân luồng trong Pentium 4. Ý của bạn có nghĩa là đa tiến trình và hệ thống phân tán hay đa luồng? Bạn có thể làm cả hai trên thực tế nhưng bản chất của các chủ đề là nhận được song song bất kể bộ vi xử lý. Tăng FYI dựa trên các chủ đề posix theo như tôi biết và tôi thấy nó khá dễ sử dụng. Ngoài ra tiêu chuẩn C++ 0x mới sẽ bao gồm hỗ trợ luồng gốc cho ngôn ngữ. – AJG85
Bạn nghĩ gì về Boost và Intel TBB? Nó nhanh hơn TBB của Intel? Hoặc tôi nên đi cho Intel nếu tôi có một bộ xử lý intel? – Nazka
Intel TBB có lợi thế ở một số lĩnh vực mà nó cung cấp các phần tử song song được tối ưu hóa song song như các vòng lặp song song, v.v., trợ giúp trong việc tạo ra các thuật toán kiểu thu thập phân tán song song trên bộ vi xử lý của Intel, cũng như các tính toán song song khác. Chủ đề Boost chủ yếu là một gói phần mềm đa nền tảng sẽ chạy trên nhiều loại nền tảng phần cứng và hệ điều hành. Bạn nếu bạn cần một số nguyên thủy tính toán song song mặc dù, chủ đề Boost không trực tiếp cung cấp, bạn sẽ phải tự mình mã hóa chúng. Vì vậy, bạn có thể xem TBB như đang ở mức trừu tượng cao hơn Boost. – Jason