Продолжение вчерашней темы с ложно позитивным срабатыванием thread sanitizer, когда TSan ошибочно диагностировал инверсию порядка захвата mutex-ов.
Поскольку в коде с точки зрения порядка блокировок все было OK, то возник вопрос: а как удовлетворить TSan, чтобы избавиться от ложной диагностики и продолжить использовать TSan для поиска других проблем?
Было найдено вот такое решение:
|
#if defined( __SANITIZE_THREAD__ ) template< typename M > class tsan_friendly_lock_guard { M & m_what; public: tsan_friendly_lock_guard( M & what ) : m_what{ what } { while( !m_what.try_lock() ) { std::this_thread::yield(); } } ~tsan_friendly_lock_guard() { m_what.unlock(); } }; #else template< typename M > class tsan_friendly_lock_guard { std::lock_guard< M > m_guard; public: tsan_friendly_lock_guard( M & mutex ) : m_guard{ mutex } {} }; #endif |
Затем в тех местах кода, где TSan ругался на потенциальную инверсию порядка захвата mutex-ов, std::lock_guard был заменен на tsan_friendly_lock_guard. И оно сработало: https://godbolt.org/z/fb84zsr4M.
Комментариев нет:
Отправить комментарий