Tôi cố gắng để sử dụng đọc/ghi khóa trong C++ sử dụng shared_mutexđọc Viết thực hiện khóa trong C++
typedef boost::shared_mutex Lock;
typedef boost::unique_lock<Lock> WriteLock;
typedef boost::shared_lock<Lock> ReadLock;
class Test {
Lock lock;
WriteLock writeLock;
ReadLock readLock;
Test() : writeLock(lock), readLock(lock) {}
readFn1() {
readLock.lock();
/*
Some Code
*/
readLock.unlock();
}
readFn2() {
readLock.lock();
/*
Some Code
*/
readLock.unlock();
}
writeFn1() {
writeLock.lock();
/*
Some Code
*/
writeLock.unlock();
}
writeFn2() {
writeLock.lock();
/*
Some Code
*/
writeLock.unlock();
}
}
Mã này dường như được làm việc tốt nhưng tôi có một vài câu hỏi khái niệm.
Q1. Tôi đã thấy các khuyến nghị để sử dụng unique_lock và shared_lock trên http://en.cppreference.com/w/cpp/thread/shared_mutex/lock, nhưng tôi không hiểu tại sao vì shared_mutex đã hỗ trợ các phương thức lock và shared_shared?
Q2. Mã này có tiềm năng gây ra nạn đói viết không? Nếu có thì làm thế nào tôi có thể tránh được nạn đói?
Q3. Có khóa học nào khác mà tôi có thể thử thực hiện khóa ghi đọc không?
Nếu bạn quan sát việc ghi đói (hoặc đọc đói), hãy báo cáo lỗi. Có tồn tại các thuật toán mà đảm bảo đói không xảy ra, và đây là lý do tại sao không có API ưu tiên người đọc/nhà văn trong mã này. Xem http://stackoverflow.com/a/14307116/576911 để biết các liên kết đến các thuật toán đó. Dưới đây là liên kết đến bài báo có lý do và triển khai từng phần: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html#shared_mutex_imp –