ThreadSanitizerは255スレッドを超えるとデータ競合を見逃す
Data races and the limits of ThreadSanitizer in C and Go
ClangやGCC、Goなどが採用するデータ競合検出器ThreadSanitizer(TSan)の限界を、Pythonで理想化したCインタプリタとFastTrack方式のベクタークロックを実装しながら解説。TSanはスレッド総数が255を超えると競合を確実に報告できず、Goのgoroutineを多用するWebサービスでは珍しくない状況だ。さらにsync.Poolの設計により、無関係なプールのオブジェクトが同じスロットにハッシュされると競合が隠蔽されるGo固有の盲点も指摘する。
TSanはスレッド総数が255の境界を越えると、データ競合を確実に報告できない。