2008-10-20 35 views
41

Tôi tiếp tục nghe về lập trình đồng thời mọi nơi. Các bạn có thể ném một số ánh sáng về những gì nó và làm thế nào c + + tiêu chuẩn mới tạo điều kiện làm giống nhau?Lập trình đồng thời C++?

+3

Nếu tính toán đồng thời là mới đối với bạn, hãy đảm bảo xem một số bài viết cơ bản như http://en.wikipedia.org/wiki/Concurrent_programming. – lothar

Trả lời

68

Đồng thời là về mã của bạn đang thực hiện nhiều việc cùng một lúc. Điều này thường được thực hiện với "luồng" rõ ràng, nhưng có những khả năng khác. Ví dụ, nếu bạn sử dụng các chỉ thị OpenMP trong mã của bạn thì trình biên dịch hỗ trợ OpenMP sẽ tự động tạo các luồng cho bạn.

Chủ đề viết tắt của "chuỗi thực thi". Trong một chương trình C++ đơn luồng, thực hiện bắt đầu tại main(), và sau đó tiến hành theo kiểu tuần tự. Trong một chương trình đa luồng, luồng đầu tiên bắt đầu ở chính, nhưng các luồng bổ sung có thể được bắt đầu bằng ứng dụng bắt đầu từ một hàm do người dùng chỉ định. Sau đó, chạy đồng thời, hoặc song song với chuỗi ban đầu.

Trong bài 0x C++ được bắt đầu sử dụng lớp std::thread:

void my_function() 
{ 
    // do stuff 
} 
std::thread my_thread(my_function); // run my_function in its own thread 

Tiêu chuẩn C++ 0x mới cũng hỗ trợ:

  • giá trị nguyên tử và các hoạt động với các mẫu std::atomic<> lớp,
  • mutexes để bảo vệ dữ liệu (std::mutex, std::recursive_mutex, v.v.)
  • khóa lớp học r dễ quản lý khóa đời (std::lock_guard<>, std::unique_lock<>)
  • std::lockstd::try_lock chức năng để quản lý việc mua nhiều ổ khóa cùng một lúc mà không sợ bế tắc
  • biến điều kiện để giảm bớt chờ đợi một sự kiện (std::condition_variable, std::condition_variable_any)
  • tương lai , hứa hẹn và đóng gói các nhiệm vụ để đơn giản hóa việc truyền dữ liệu giữa các luồng và chờ một giá trị sẵn sàng. Điều này giải quyết câu hỏi "làm thế nào để tôi trả về giá trị từ một chuỗi".
  • thread-safe khởi của tĩnh địa phương đối tượng
  • từ khóa thread_local để khai báo dữ liệu thread-địa phương

tôi đã đưa ra một cái nhìn tổng quan chi tiết hơn về các thư viện thread C++ 0x mới trong bài viết của tôi trên DevX. com: Simpler Multithreading in C++0x

Tôi viết về đa luồng và đồng thời trong C++ trên my blog. Tôi cũng đang viết một cuốn sách về chủ đề: C++ Concurrency in Action.

+1

Có thể thêm bất cứ điều gì ngay bây giờ khi C++ 11 không? Tôi có thể tưởng tượng chúng ta có thể sử dụng ngữ nghĩa di chuyển? – Damian

+0

Có, bạn có thể sử dụng ngữ nghĩa di chuyển với 'std :: thread' và' std :: async'. –

5

Concurrency là có nhiều đề thi cho một quá trình nhất định. Tính đến hôm nay, C++ không hỗ trợ trực tiếp. Tuy nhiên, một số thư viện tồn tại sẽ liên kết một hàm nhất định với một luồng thực thi mới. Chuẩn Unix là thư viện pthreads.

+1

Chuẩn Posix (không phải Unix) –

17

Khi bạn nói "làm thế nào c + + tiêu chuẩn mới tạo điều kiện" lập trình đồng thời, tôi giả sử bạn đang nói về sớm (?) Sẽ được phát hành C++ 09 tiêu chuẩn.

Tiêu chuẩn mới vì nó hiện đang đứng ở dạng dự thảo hỗ trợ các mục sau đây giúp với lập trình đồng thời:

  • loại nguyên tử và địa chỉ
  • một lớp chủ đề
  • lưu trữ thread_local (tài khoản vừa thêm vào dự thảo tiêu chuẩn cách đây vài tháng)
  • loại trừ lẫn nhau (các lớp mutex)
  • biến điều kiện - điều này đặc biệt tốt cho Windows, vì có điều kiện các biến ion rất khó thực hiện một cách chính xác trong Win32. Điều này có nghĩa rằng cuối cùng Microsoft nên cung cấp hỗ trợ cho các biến điều kiện ít nhất trong thời gian chạy MSVC++, do đó sẽ dễ dàng có được các ngữ nghĩa biến điều kiện chính xác trên WIn32.
+0

Có ai đã viết một bản tóm tắt tốt về các tính năng này chưa? –

+0

Tôi nghĩ rằng chúng chủ yếu dựa trên boost :: thread nên không có nhiều sự khác biệt giữa tài liệu đó và tiêu chuẩn mới. – gbjbaanb

3

của tôi mất hơi khác nhau, cụ thể để định hướng tương lai của mô hình lập trình:

Concurrency là về cách viết chương trình của bạn như vậy mà nó có thể được làm nhiều việc cùng một lúc nếu phần cứng hỗ trợ nó. Hiện nay, hầu hết các ngôn ngữ có cơ chế khá nặng và phức tạp để cho phép lập trình viên xác định điều này (ví dụ: các luồng có đồng bộ hóa thủ công, các chỉ thị tiền xử lý OpenMP, v.v.).

Khi phần cứng được cải thiện, nó sẽ cải thiện theo chiều ngang (nhiều lõi) hơn là theo chiều dọc (lõi đơn nhanh hơn). Điều này có nghĩa là các ứng dụng sẽ cần phải có "đồng thời tiềm ẩn" để mở rộng với phần cứng "nhanh hơn". Ngôn ngữ hiện đang cố gắng phát triển để hỗ trợ tốt nhất điều này, để được ở vị trí của ngôn ngữ tốt nhất cho sự phát triển trong tương lai.

C++ 0x đang thêm hỗ trợ tích hợp sẵn cho các phương thức đồng bộ hóa "cũ" của chương trình. Các nhà cung cấp trình biên dịch khác nhau đang thêm các phương thức "mới" để trừu tượng hóa mô hình luồng và cho phép các quyết định thời gian chạy trên các số luồng, vv (dựa trên phần cứng của máy); cho Microsoft nói riêng, hãy xem F #, thời gian chạy đồng thời, tiện ích mở rộng song song, v.v.

Hy vọng điều đó sẽ hữu ích.

5

C++ CSP2 - Dễ dàng truy cập đồng thời cho C++

http://www.cs.kent.ac.uk/projects/ofa/c++csp/

CSP là một dựa trên một mô hình đồng thời thích hợp như trái ngược với chủ đề và các ổ khóa và tất cả các cách thức khác của sự vật được tacked trên là một suy nghĩ .

(Xem Occam-Pi cho một ngôn ngữ lập trình đồng thời (cũng dựa trên CSP))

4

bài viết: Kiểm tra những bài viết này để biết về đồng thời

  1. Free lunch is over
  2. Selected articles by herbsutter
  3. Link to pdf
+0

Bạn sẽ thêm bản tóm tắt các điểm chính của bài viết hay đây là [link-only-answer] (http://meta.stackexchange.com/questions/72000/should-there-be-a- chính sách-về-một-link-chỉ-câu trả lời)? (Một trong các liên kết đã chết, btw.) – jogojapan

1

Đây là bài viết hay nhất để hiểu lập trình đồng thời: Concurrent Programming

Bạn sẽ nhận được bức tranh đầy đủ về lập trình đồng thời và C++ sau khi đọc.

Tóm tắt nhanh, chúng tôi có thể nói rằng lập trình đồng thời là thực hiện đa nhiệm. Khi một chương trình bị chặn, nó có thể làm những việc khác. Thông thường chúng tôi bị chặn trong khi chờ kết nối mạng và xử lý I/O. Chúng tôi có thể tạo điều kiện lập trình đồng thời bằng cách sử dụng fork() và thư viện chuỗi.

+0

Liên kết bạn đăng trả về 404. – xyres

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