Readers–writer lock
Reader-Writer Lock(이후 RW lock)은 Mutex와 비슷하지만, 좀 더 높은 페럴리즘을 제공합니다. Mutex는 두 가지 상태(lock과 unlock)만을 가지면서 동시에 한 스레드만 락을 걸 수 있지만, RW lock은 세 가지 상태(read-lock, write-lock, unlock)를 가집니다. write-lock은 동시에 하나의 스레드만 락을 걸 수 있지만, read-lock은 동시에 여러 스레드에서 걸 수 있습니다.
write-lock이 걸린 상태에서 락을 시도하는 스레드들은 락이 풀릴때까지 모두 블록됩니다. read-lock이 걸린 상태에서 read-lock을 시도하는 스레드들은 락을 걸 수 있지만, write-lock을 시도하는 스레드는 락을 걸고 있는 모든 스레드가 락을 풀때까지 블록됩니다. RW lock을 어떻게 구현했는가에 따라 다를수 있지만 일반적으로 write-lock을 걸기위해 블록되어 있는 스레드가 있다면, 이후에 read-lock을 시도하는 스레드는 블록됩니다. 그렇지 않으면 write-lock을 걸기위해 대기하고 있는 스레드는 영원히 블록되어 있을수도 있기 때문이죠.
write-lock이 걸린 상태에서 데이터에 대한 접근은 하나의 스레드만이 가능하고, read-lock이 걸린 상태에서는 여러 스레드가 데이터에 접근이 가능합니다. 따라서, RW lock은 락에 의해 보호되는 데이터가 변경(modify)보다는 읽기(read)가 자주 일어나는 경우에 효과적입니다.
Readers–writers problem
전산학에서 독자-저자 문제(readers-writers problem)란 여러 명의 독자와 저자들이 하나의 저장 공간(버퍼)을 공유하며 이를 접근할 때 발생하는 문제이다. 독자는 공유 공간에서 데이터를 읽어온다. 여러 명의 독자가 동시에 데이터를 읽어오는 것이 가능하다. 저자는 공유 공간에 데이터를 쓴다. 한 저자가 공유 공간에 데이터를 쓰고 있는 동안에는 그 저자만 접근이 가능하며, 다른 독자들과 저자들은 접근할 수 없다.
Boost version
- See std::shared_mutex
- Stackoverflow: Reader/Writer Locks in C++
- Stackoverflow: Multiple-readers, single-writer locks in Boost
- Boost의 shared_mutex
#include <boost/thread/locks.hpp>
#include <boost/thread/shared_mutex.hpp>
boost::shared_mutex _access;
void reader()
{
// get shared access
boost::shared_lock<boost::shared_mutex> lock(_access);
// now we have shared access
}
void writer()
{
// get upgradable access
boost::upgrade_lock<boost::shared_mutex> lock(_access);
// get exclusive access
boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
// now we have exclusive access
}
See also
Favorite site
- Wikipedia (en) R/W Lock에 대한 설명
- Linux Programming - 스레드(Thread) 동기화 - RW Lock
- 동기화 클래스 - ReadWriteLock 인터페이스의 ReentrantReadWriteLock
- Read/Write Lock
- Codeproject.com: Fast Readers/Writer Lock
- [추천] Stackoverflow: How would a readers/writer lock be implemented in C++11?
- Multiple-Reader, Single-Writer Synchronization Lock Class
- Mutex Vs Spinlock
- C/C++ RWLock
- 동기화 기법: Read-Copy-Update