2012-02-13 36 views
5

Hiện tại, tôi có 2 quy trình giao tiếp bằng cách sử dụng biểu mẫu message_queue và shared_memory. Mọi thứ đều hoạt động như đã tham dự.Được tăng cường :: luồng xử lý liên tục?

Bây giờ tôi cần thực hiện một quy trình đa luồng (nhờ tăng cường lại), và tôi đã tự hỏi liệu mình có cần sử dụng cơ chế bảo vệ giữa các luồng (chẳng hạn như mutex) hay không. đã cung cấp một cơ chế bảo vệ?

Tôi không tìm thấy bất kỳ thông tin nào về điều đó trên tài liệu tăng cường. Bằng cách tôi đang sử dụng tăng 1,40.

Xin cảm ơn trước.

+0

Bạn đã đọc http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html chưa? –

Trả lời

1

Bạn phải đảm bảo khóa tài nguyên được chia sẻ.

Bạn có thể tìm thấy các ví dụ trong tài liệu tăng cường. Ví dụ:

http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.mutexes.mutexes_scoped_lock

+0

Vì vậy, nếu tôi hiểu đúng, không có cơ chế bảo vệ nào được triển khai. Bạn phải bảo vệ rõ ràng bộ nhớ và hàng đợi của bạn. – Tom97531

2

Các tài nguyên chia sẻ từ tăng :: interprocess (bộ nhớ chia sẻ, vv) yêu cầu bạn cung cấp đồng bộ cần thiết. Lý do cho điều này là bạn có thể không yêu cầu đồng bộ hóa, và nó thường là một hiệu suất hoạt động hơi đắt tiền khôn ngoan.

Hãy nói ví dụ rằng bạn đã có một quy trình ghi vào bộ nhớ chia sẻ thống kê hiện tại về điều gì đó ở định dạng số nguyên 32 bit và một vài quy trình đọc các giá trị đó. Vì các giá trị là số nguyên (và do đó trên nền tảng của bạn đọc và viết là nguyên tử) và bạn có một quá trình viết chúng và một vài quá trình đọc chúng, không cần đồng bộ hóa cho thiết kế này.

Tuy nhiên trong một số ví dụ, bạn sẽ yêu cầu đồng bộ hóa, như thể ví dụ trên có nhiều người viết hoặc nếu thay vì số nguyên bạn đang sử dụng dữ liệu chuỗi. Có cơ chế đồng bộ hóa khác nhau bên trong tăng (cũng như những người không tăng, nhưng kể từ khi bạn tăng đã sử dụng), được mô tả ở đây:

[Boost thông tin cho phiên bản ổn định: 1,48] http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/synchronization_mechanisms.html

[Boost thông tin đối với phiên bản bạn đang sử dụng: 1.40] http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html

Với bộ nhớ dùng chung, đây là cách phổ biến để đặt cơ chế đồng bộ ở chân bộ nhớ chia sẻ, có nghĩa là hạt nhân OS không cấp quyền truy cập theo tên). Bằng cách này, tất cả các quy trình đều biết cách khóa phân đoạn bộ nhớ chia sẻ và bạn có thể kết hợp khóa với phân đoạn của chúng (ví dụ: nếu bạn có nhiều phân đoạn)

Hãy nhớ rằng một mutex yêu cầu cùng một luồng thực thi (bên trong một quy trình) mở khóa nó đã khóa nó. Nếu bạn yêu cầu khóa và mở khóa một đối tượng đồng bộ hóa từ các luồng thực thi khác nhau, bạn cần một semaphore.

Hãy chắc chắn rằng nếu bạn chọn sử dụng mutex là mutex interprocess (http://www.boost.org/doc/libs/1_48_0/doc/html/boost/interprocess/interprocess_mutex.html) như trái ngược với mutex trong thư viện chủ đề tăng cường cho một quá trình đơn lẻ với nhiều luồng.

+0

+1 cho "Vì các giá trị là số nguyên (và do đó trên nền tảng của bạn đọc và viết là nguyên tử) và bạn có một quá trình viết chúng và một vài quá trình đọc chúng, không cần đồng bộ hóa cho thiết kế này." – FaceBro

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