Windows에서 std::shared_mutex의 버그 가능성
- 한 소프트웨어 팀이 Windows에서
std::shared_mutex와 관련된 예상치 못한 동작을 발견함. - 이 문제는 MSVC에서만 발생하며, MinGW나 다른 플랫폼에서는 발생하지 않음.
- 주요 스레드가 독점 잠금을 획득한 후 여러 자식 스레드가 공유 잠금을 획득하려고 할 때, 약 1000번 중 1번 꼴로 "데드락"이 발생함.
- 데드락이 발생하면 정확히 1개의 자식 스레드만 공유 잠금을 성공적으로 획득하고, 나머지 자식 스레드는
lock_shared()에서 영원히 차단됨. - 이 문제는
std::shared_mutex,std::shared_lock/std::unique_lock또는 직접 SRW 함수를 호출할 때 관찰됨.
코드 예제와 버그 재현
- 문제를 재현할 수 있는 간단한 코드가 제공됨.
- 코드는 주 스레드가 독점 잠금을 획득하고, 여러 자식 스레드가 공유 잠금을 획득한 후 이를 해제하는 과정을 반복함.
- 이 코드는 Windows MSVC 구현에서만
std::shared_mutex와 관련된 버그를 보여줌.
전문가의 의견
- STL 개발자는 이 문제가 Windows API 버그로 보인다고 언급함.
- 버그를 보고하기 위한 적절한 단계에 대한 논의가 있었으며, STL 개발자가 내부적으로 버그를 보고함.
- 다른 사용자들은 이 문제를 자세히 조사하고, SRWLock 구현의 특정 버그를 좁혀내는 데 기여함.
GN⁺의 의견
- 이 기사는 C++ 개발자들에게 특히 중요한 정보를 제공함.
std::shared_mutex의 잠재적인 버그는 멀티스레딩 애플리케이션의 동기화 메커니즘에 영향을 줄 수 있기 때문임. - 버그가 확인되면, 이는 C++ 표준 라이브러리의 구현에 대한 신뢰도에 영향을 미칠 수 있음. 개발자들은 이러한 문제를 인지하고 대안적인 동기화 메커니즘을 고려해야 할 수도 있음.
- 이 문제는 특히 고성능이나 실시간 시스템에서 중요할 수 있음. 이러한 시스템에서는 데드락이 치명적인 결과를 초래할 수 있기 때문임.
- 이 기술을 도입하기 전에, 개발자들은 해당 플랫폼과 컴파일러에 대한 광범위한 테스트를 수행하여 이러한 유형의 버그가 없는지 확인해야 함.
- 이러한 문제를 해결하기 위해, 개발자들은 Boost 라이브러리와 같은 대체 동기화 라이브러리를 고려할 수 있음. Boost는 광범위하게 테스트되고 많은 플랫폼에서 사용되므로, 이러한 문제에 대한 안정적인 대안을 제공할 수 있음.