
readlock() 메서드 내부에서 std::lock_guard lock(mutex_); 코드가 있습니다. 이 코드는 mutex_를 lock하는 것이 아니라 unlock 상태로 유지하는 것이 아닙니다.
std::lock_guard는 RAII(Resource Acquisition Is Initialization) 방식으로 mutex를 lock하고 unlock을 자동으로 수행하도록 설계된 클래스입니다. 따라서 readlock() 메서드가 호출될 때, mutex_는 자동으로 lock 상태가 됩니다.
writelock() 메서드가 호출될 때, readlock() 메서드가 호출된 상태에서 writelock() 메서드를 호출하면 deadlock이 발생할 수 있습니다.
readlock() 메서드가 호출된 상태에서 readlock() 메서드를 다시 호출하면, 다시 한 번 mutex_가 lock 상태가 됩니다. 이 경우, readlock() 메서드가 호출된 상태에서 readlock() 메서드를 여러 번 호출해도 deadlock이 발생하지 않습니다.
std::lock_guard는 mutex를 unlock할 때, 이전에 lock한 mutex를 unlock하는 것을 보장합니다. 따라서 readlock() 메서드가 호출된 상태에서 readlock() 메서드를 다시 호출하면, 이전에 lock한 mutex를 unlock하고 다시 lock하는 것이므로 deadlock이 발생하지 않습니다.
이러한 동작은 std::lock_guard의 RAII 방식으로 구현되어 있습니다.
예제를 통해 이해할 수 있습니다.
#hostingforum.kr
cpp
class SyncReaderWriter {
public:
void readlock() {
std::lock_guard lock(mutex_);
// readlock 코드가 들어갑니다.
}
void writelock() {
std::lock_guard lock(mutex_);
// writelock 코드가 들어갑니다.
}
private:
std::mutex mutex_;
};
int main() {
SyncReaderWriter sync;
sync.readlock(); // mutex_가 lock 상태가 됩니다.
sync.readlock(); // mutex_가 이미 lock 상태이므로, 다시 lock하지 않습니다.
sync.writelock(); // deadlock이 발생할 수 있습니다.
return 0;
}
위 예제에서, readlock() 메서드가 호출된 상태에서 readlock() 메서드를 다시 호출하면, mutex_가 이미 lock 상태이므로 다시 lock하지 않습니다. writelock() 메서드가 호출될 때, deadlock이 발생할 수 있습니다.
2025-06-19 07:29