2009-11-18 65 views
10

Thư viện Boost Thread so sánh với thư viện java.util.concurrent như thế nào?thư viện java.util.concurrent vs. Boost Threads

Hiệu suất rất quan trọng và vì vậy tôi muốn ở lại với C++ (mặc dù Java nhanh hơn rất nhiều trong những ngày này). Cho rằng tôi phải viết mã trong C++, những thư viện nào tồn tại để tạo luồng dễ dàng và ít bị lỗi hơn.

Gần đây tôi đã nghe nói rằng kể từ JDK 1.5, mô hình bộ nhớ Java đã được thay đổi để khắc phục một số vấn đề tương tranh. Làm thế nào về C + +? Lần cuối cùng tôi lập trình đa luồng trong C++ là 3-4 năm trước khi tôi sử dụng pthreads. Mặc dù, tôi không muốn sử dụng nó nữa cho một dự án lớn. Cách duy nhất khác mà tôi biết là Tăng Chủ đề. Tuy nhiên, tôi không chắc chắn nếu nó là tốt. Tôi đã nghe những điều tốt đẹp về java.util.concurrent, nhưng không có gì về chủ đề Boost.

+7

Martin, tôi nghĩ điều đó có nghĩa là "Java nhanh hơn rất nhiều so với trước đây". – zedoo

+7

Trong kinh nghiệm của tôi bất cứ lúc nào một số người nói "Hiệu suất là rất quan trọng" mà không có chi tiết cụ thể, nó không thực sự quan trọng chút nào. Đừng chọn C++ hoặc Java vì lý do hiệu suất, chọn C++ hoặc Java vì bạn quen thuộc hơn với nó hoặc bạn thấy dễ dàng hơn khi lập trình. –

Trả lời

10

Chủ đề tăng cường dễ sử dụng hơn nhiều so với pthread, và theo tôi, hơi dễ sử dụng hơn so với các chuỗi Java. Khi một đối tượng thread boost được khởi tạo, nó khởi chạy một luồng mới. Người dùng cung cấp một hàm hoặc đối tượng hàm sẽ chạy trong chuỗi mới đó.

Nó thực sự đơn giản như:

boost::thread* thr = new boost::thread(MyFunc()); 
thr->join(); 

Bạn có thể dễ dàng truyền dữ liệu đến các chủ đề bằng cách lưu trữ các giá trị bên trong đối tượng chức năng. Và trong phiên bản mới nhất của boost, bạn có thể chuyển một số biến số của các đối số tới chính constructor của luồng, sau đó nó sẽ được chuyển cho toán tử () của đối tượng hàm của bạn.

Bạn cũng có thể sử dụng khóa kiểu RAII với boost::mutex để đồng bộ hóa.

Lưu ý rằng C++ 0x sẽ sử dụng cùng cú pháp cho std::thread.

+1

IMHO Mục đích của các thư viện đồng thời Java là làm cho luồng đa luồng dễ dàng hơn so với kế hoạch Các luồng Java (dựa trên pthreads) –

+0

@PeterLawrey Có gì sai với pthread? Trừ khi bạn đang nói về các bộ sưu tập đồng thời trong Java, thì những thứ đó là không thể trong pthreads. –

+1

@IgorGanapolsky không có gì sai với pthreads. Tôi đã làm cho điểm mà so sánh Boost với Java chủ đề là không giống như so sánh Tăng với java.util.concurrent được thêm vào năm 2006 và đây là dễ dàng hơn rất nhiều. API parallelStream() dễ dàng hơn nhiều lần nữa. –

1

Nếu bạn đang nhắm mục tiêu nền tảng cụ thể thì cuộc gọi hệ điều hành trực tiếp có thể sẽ nhanh hơn một chút so với việc sử dụng tăng cho C++. Tôi sẽ có xu hướng sử dụng ACE, vì bạn thường có thể thực hiện các cuộc gọi phù hợp với nền tảng chính của bạn và nó vẫn sẽ là nền tảng độc lập. Java nên có tốc độ tương tự miễn là bạn có thể đảm bảo rằng nó sẽ chạy trên một phiên bản gần đây.

+2

Boost.thread nhanh hơn ACE vì lý do duy nhất là tăng cường sử dụng mẫu. Cả boost và ACE đều sử dụng các cuộc gọi OS giống nhau. Mã biên dịch của Boost, tuy nhiên, là rất gần với những gì bạn sẽ viết bằng cách sử dụng pthreads bản địa. Trong khi ACE phải thu thập thông tin qua các lớp trừu tượng trước khi nó chạm vào các nguyên bản của hệ điều hành gốc. Java sẽ có một vấn đề tương tự nhưng JVM có thể loại bỏ hầu hết (tất cả?) Chi phí trừu tượng. –

+0

Đừng quên rằng ACE tập trung vào giao tiếp nền tảng chéo và bổ sung thêm nhiều trừu tượng mức cao hơn như khung Reactor/Proactor. Vì vậy, từ quan điểm đó nó có thể được ưa thích hơn thúc đẩy. – count0

7

Hiệu suất khôn ngoan tôi sẽ không thực sự lo lắng. Đó là cảm giác của tôi rằng một chuyên gia tăng/C++ có thể viết mã nhanh hơn một chuyên gia java. Nhưng mọi lợi thế sẽ phải chiến đấu.

Tôi thích các mẫu thiết kế của Boost cho Java. Java là OO tất cả các cách, nơi Boost/C++ cho phép OO nếu bạn thích nhưng sử dụng các mô hình hữu ích nhất cho vấn đề ở bàn tay. Đặc biệt tôi yêu RAII khi giao dịch với ổ khóa. Java xử lý quản lý bộ nhớ một cách đẹp mắt, nhưng đôi khi nó cảm thấy như phần còn lại của tài nguyên lập trình bị trục trặc: xử lý tệp, mutexes, DB, ổ cắm, v.v.

Thư viện đồng thời của Java rộng hơn thư viện của Boost. Chủ đề hồ bơi, đồng thời container, nguyên tử, vv Nhưng cốt lõi nguyên thủy ngang bằng với nhau, chủ đề, mutexes, biến điều kiện.

Vì vậy, để thực hiện tôi muốn nói đó là một lần rửa. Nếu bạn cần nhiều hỗ trợ thư viện đồng thời cấp cao, Java sẽ thắng. Nếu bạn thích tự do mô hình C++.

12

java.util.concurrent và boost threads library có chức năng chồng chéo, nhưng java.util.concurrent cũng cung cấp a) trừu tượng mức cao hơn và b) cũng có chức năng cấp thấp hơn.

đề Boost cung cấp:

java.util.concurrent cũng có:

Lưu ý phụ: C++ hiện không có mô hình bộ nhớ. Trên một máy khác, cùng một ứng dụng C++ có thể phải xử lý một mô hình bộ nhớ khác. Điều này làm cho lập trình di động, đồng thời trong C++ thậm chí còn phức tạp hơn.

0

Trong C++ người ta có thể trực tiếp sử dụng pthreads (pthread_create() vv) nếu muốn. Java nội bộ sử dụng pthreads thông qua môi trường thời gian chạy của nó. Làm "ldd" để xem.

4

Nếu hiệu suất là một vấn đề trong chương trình đa luồng của bạn, thì bạn nên xem xét thiết kế không có khóa.
Khóa không có nghĩa là chủ đề không cạnh tranh cho tài nguyên được chia sẻ và giảm thiểu chi phí chuyển đổi. Trong bộ phận đó, Java có một câu chuyện IMHO tốt hơn, với các bộ sưu tập đồng thời của nó. Bạn có thể nhanh chóng tìm ra giải pháp không có khóa.
Vì đã sử dụng đề tài Tăng tốc một chút (nhưng không rộng rãi), tôi có thể nói rằng suy nghĩ của bạn sẽ bị ảnh hưởng bởi những gì có sẵn, và điều đó có nghĩa là giải pháp khóa cơ bản.
Viết giải pháp C++ không có khóa là rất khó, vì thiếu hỗ trợ thư viện và cũng vì khái niệm vì nó thiếu một mô hình bộ nhớ đảm bảo bạn có thể viết các đối tượng thật bất biến.

sách này phải đọc: Java Concurrency in Practice

Các vấn đề liên quan