Skip to content

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

#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