Tìm hiểu về Std:Shared_mutex từ C++17
Tìm hiểu cách std::shared_mutex từ C++17 cho phép khóa trình đọc-ghi hiệu quả, cho phép nhiều lần đọc đồng thời trong khi vẫn đảm bảo quyền truy cập ghi độc quyền.
Mewayz Team
Editorial Team
Hiểu std::shared_mutex từ C++ 17
std::shared_mutex, được giới thiệu trong C++ 17, là một nguyên tắc đồng bộ hóa cho phép nhiều luồng đồng thời giữ các khóa chia sẻ (đọc) trong khi vẫn đảm bảo quyền truy cập độc quyền cho các hoạt động ghi. Nó giải quyết một trong những thách thức tương tranh phổ biến nhất trong C++ hiện đại bằng cách cung cấp cho các nhà phát triển một cách tiêu chuẩn, rõ ràng để triển khai khóa trình đọc-ghi mà không cần truy cập vào thư viện của bên thứ ba hoặc API dành riêng cho nền tảng.
Chính xác thì std::shared_mutex là gì và tại sao nó lại được thêm vào C++17?
Trước C++ 17, các nhà phát triển cần ngữ nghĩa của trình đọc-ghi phải dựa vào các giải pháp dành riêng cho nền tảng như pthread_rwlock_t trên hệ thống POSIX hoặc SRWLOCK trên Windows, nếu không họ sẽ sử dụng các thư viện của bên thứ ba như Boost. Ủy ban tiêu chuẩn C++17 đã nhận ra lỗ hổng này và đưa std::shared_mutex vào tiêu đề
Ý tưởng cốt lõi rất đơn giản: trong nhiều chương trình thực tế, dữ liệu được đọc thường xuyên hơn nhiều so với dữ liệu được ghi. Tiêu chuẩn std::mutex tuần tự hóa tất cả quyền truy cập - bao gồm cả lượt đọc - điều này tạo ra những tắc nghẽn không cần thiết. std::shared_mutex dỡ bỏ hạn chế đó bằng cách phân biệt giữa hai chế độ khóa:
Khóa chia sẻ (đọc) - được lấy qua lock_shared(); nhiều luồng có thể giữ điều này đồng thời, khiến nó trở nên lý tưởng cho việc đọc đồng thời.
Khóa (ghi) độc quyền - có được thông qua lock(); mỗi lần chỉ có một luồng có thể giữ cái này và không được phép khóa chung trong khi nó được giữ.
std::shared_lock — một trình bao bọc RAII gọi lock_shared() khi xây dựng và unlock_shared() khi hủy, ngăn chặn rò rỉ tài nguyên.
std::unique_lock / std::lock_guard — được sử dụng với chế độ độc quyền, đảm bảo các thao tác ghi được bảo vệ hoàn toàn và an toàn ngoại lệ.
Thiết kế chế độ kép này giúp std::shared_mutex phù hợp một cách tự nhiên với các tình huống như bộ nhớ đệm, sổ đăng ký cấu hình và bất kỳ cấu trúc dữ liệu nào mà việc đọc chiếm ưu thế trong khối lượng công việc.
Bạn sử dụng std::shared_mutex trong mã thực bằng nhận xét như thế nào?
Các nhận xét trong mã sử dụng std::shared_mutex đặc biệt có giá trị vì logic đồng thời nổi tiếng là khó lý giải. Nhận xét được đặt đúng chỗ sẽ làm rõ lý do tại sao một loại khóa cụ thể được chọn, điều này giúp giảm đáng kể nguy cơ các nhà bảo trì trong tương lai vô tình tạo ra các cuộc đua dữ liệu. Đây là một mẫu điển hình:
#include
#include
#include
lớp ConfigRegistry {
có thể thay đổi std::shared_mutex mtx_; // bảo vệ bản đồ bên dưới
std::unordered_map
💡 DID YOU KNOW?
Mewayz replaces 8+ business tools in one platform
CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.
Bắt đầu miễn phí →công cộng:
// Đọc đường dẫn: nhiều luồng có thể gọi đồng thời
std::string get(const std::string& key) const {
std::shared_lock lock(mtx_); // khóa chia sẻ - an toàn cho việc đọc đồng thời
tự động nó = data_.find(key);
trả lại != data_.end() ? nó->thứ hai : "";
}
// Đường dẫn ghi: yêu cầu quyền truy cập độc quyền
void set(const std::string& key, const std::string& val) {
std::unique_lock lock(mtx_); // khóa độc quyền - chặn tất cả người đọc
dữ liệu_[khóa] = val;
}
};
Hãy chú ý cách các nhận xét giải thích ý định đằng sau mỗi lựa chọn khóa thay vì chỉ trình bày lại chức năng của mã. Đây là tiêu chuẩn vàng: bình luận phải trả lời tại sao chứ không phải cái gì. Từ khóa có thể thay đổi trên mutex cho phép khai báo get() const trong khi vẫn có thể khóa, một mẫu phổ biến và thành ngữ.
Thông tin chi tiết về khóa: Luôn sử dụng trình bao bọc khóa RAII (std::shared_lock, std::unique_lock) với std::shared_mutex — không bao giờ gọi lock() và unlock() theo cách thủ công. Khóa thủ công khi có ngoại lệ là con đường đảm bảo dẫn đến bế tắc và hành vi không xác định.
Những cạm bẫy thường gặp khi làm việc với std::shared_mutex là gì?
Ngay cả với những nhận xét rõ ràng và ý định tốt, std::shared_mutex vẫn có những cái bẫy tinh vi có thể gây khó khăn cho các nhà phát triển có kinh nghiệm. Nguy hiểm nhất là nâng cấp khóa: không có cách tích hợp nào để nâng cấp khóa chung lên khóa độc quyền mà không giải phóng nó trước. Cố gắng làm như vậy mà không cần
Related Posts
- Công cụ hộp cát dòng lệnh ít được biết đến của macOS (2025)
- Hành Trình Mật Mã của DJB: Từ Anh Hùng Code Đến Kẻ Phá Rối Tiêu Chuẩn
- Cựu công nghệ -> Người vô gia cư ở SF
- CXMT đã cung cấp chip DDR4 với giá chỉ bằng một nửa giá thị trường hiện hành
Build Your Business OS Today
From freelancers to agencies, Mewayz powers 138,000+ businesses with 207 integrated modules. Start free, upgrade when you grow.
Create Free Account →Try Mewayz Free
All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.
Nhận thêm các bài viết như thế này
Lời khuyên kinh doanh hàng tuần và cập nhật sản phẩm. Miễn phí mãi mãi.
Bạn đã đăng ký!
Start managing your business smarter today
Join 30,000+ businesses. Free forever plan · No credit card required.
Ready to put this into practice?
Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.
Bắt đầu Dùng thử Miễn phí →Bài viết liên quan
Hacker News
Seurat Nổi tiếng nhất với bức tranh Công viên Paris Tuy nhiên, một nửa số bức tranh của ông là phong cảnh biển
Mar 7, 2026
Hacker News
Một phần nghìn giây có thể thay đổi phương pháp điều trị ung thư
Mar 7, 2026
Hacker News
Hiển thị HN: Argus – Trình gỡ lỗi VSCode cho các phiên Claude Code
Mar 7, 2026
Hacker News
LLM không viết mã chính xác. Nó viết mã hợp lý
Mar 7, 2026
Hacker News
Hiển thị HN: ANSI-Saver – Trình bảo vệ màn hình macOS
Mar 7, 2026
Hacker News
Cô gái giao sữa chua chống lại sự cô đơn ở Nhật Bản
Mar 7, 2026
Sẵn sàng hành động?
Bắt đầu dùng thử Mewayz miễn phí của bạn ngay hôm nay
All-in-one business platform. No credit card required.
Bắt đầu miễn phí →14-day free trial · No credit card · Cancel anytime