Tôi đang tạo một chương trình đa luồng C++ sử dụng pthread (tiêu chuẩn C++ 98).Đồng bộ hóa chủ đề cho bản đồ C++
Tôi có std :: bản đồ mà nhiều chuỗi sẽ truy cập. Quyền truy cập sẽ thêm và xóa các phần tử, sử dụng tìm và cũng truy cập các phần tử bằng toán tử [].
Tôi hiểu rằng việc đọc bằng toán tử [] hoặc thậm chí sửa đổi các thành phần với nó là luồng an toàn, nhưng phần còn lại của các thao tác thì không.
Câu hỏi đầu tiên: tôi có hiểu chính xác điều này không?
Một số chủ đề sẽ chỉ truy cập các phần tử qua [], trong khi một số khác sẽ thực hiện một số thao tác khác. Rõ ràng tôi cần một số hình thức đồng bộ hóa thread.
Cách tôi thấy điều này sẽ hoạt động là: - Trong khi không có thao tác "ghi" đang được thực hiện trên bản đồ, tất cả các chuỗi đều có thể "đọc" từ đồng thời. - Khi một chủ đề muốn "ghi" vào bản đồ, nó sẽ đặt khóa để không có luồng nào bắt đầu bất kỳ thao tác "đọc" hoặc "ghi" nào, và sau đó nó sẽ đợi cho đến khi tất cả các thao tác "đọc" đã hoàn thành, tại thời điểm đó nó sẽ thực hiện thao tác và giải phóng khóa. - Sau khi khóa đã được giải phóng, tất cả các chuỗi sẽ có thể đọc tự do.
Câu hỏi chính là: Tôi có thể sử dụng phương pháp đồng bộ hóa chủ đề nào để đạt được hành vi này?
Tôi đã đọc về mutex, biến có điều kiện và semaphores, và theo như tôi có thể thấy họ sẽ không làm excatly những gì tôi cần. Tôi quen thuộc với mutex nhưng không phải với cond. biến hoặc semaphores.
Vấn đề chính mà tôi thấy là tôi cần một cách khóa luồng cho đến khi có điều gì đó xảy ra (thao tác ghi kết thúc) mà không có chủ đề nào sau đó khóa bất kỳ thứ gì. Ngoài ra tôi cần một cái gì đó giống như một semaphore ngược, mà khối trong khi truy cập là nhiều hơn 1 và sau đó thức dậy khi nó là 0 (tức là không có hoạt động đọc đang được thực hiện).
Xin cảm ơn trước.
P.S. Đó là bài viết đầu tiên của tôi. Vui lòng cho biết nếu tôi đang làm điều gì sai!
Bạn chỉ cần một trình soạn thảo độc giả? –
Bạn cần khóa RW, hãy thử [ví dụ này.] (Http://stackoverflow.com/questions/989795/example-for-boost-shared-mutex-multiple-reads-one-write) – gbjbaanb
Bài đăng đầu tiên tốt. Chắc chắn bạn không thể sử dụng [C++ 11] (http://en.cppreference.com/w/cpp/thread)? Nó sẽ đơn giản hóa mã của bạn và làm cho nó dễ dàng hơn. Tùy thuộc vào bản chất của các thành phần thùng chứa, bạn có thể không cần các tính năng luồng nặng hơn. Có lẽ [sync] (http://en.cppreference.com/w/cpp/atomic) nguyên thủy sẽ là đủ. –