我正在運行一個帶有執行緒消毒程式的程式,想知道如何解釋以下警告:
==================
WARNING: ThreadSanitizer: data race (pid=2788668)
Read of size 4 at 0x7f7eefc4e298 by main thread:
[Stacktrace follows...]
Previous write of size 8 at 0x7f7eefc4e298 by thread T27:
[Stacktrace follows...]
Location is heap block of size 307272 at 0x7f7eefc1c000 allocated by thread T27
[Stacktrace follows...]
Thread T27 (tid=2790352, running) created by main thread at:
[Stacktrace follows...]
==================
我將此訊息解釋為只是說主執行緒讀取了先前由不同執行緒寫入的記憶體。不同的執行緒是由主執行緒創建的,這個不同的執行緒也分配了記憶體。這樣對嗎?如果是這樣,有沒有辦法在以下運行中抑制此特定警告?
uj5u.com熱心網友回復:
警告是一個真正的錯誤(除非它是誤報)。
執行緒 T27 寫入了 8 個位元組來尋址0x7f7eefc4e298,主執行緒在沒有鎖定的情況下讀取了前 4 個位元組(就消毒劑而言)。這是一種競爭條件和未定義的行為。
換句話說,訪問0x7f7eefc4e298不受鎖或其他同步原語的保護。是這樣嗎?
如果您堅持,有一種方法可以讓它們靜音,請創建一個supp.txt檔案:
# Silences all races originating in bar_function
race:foo_namespace::bar_function
然后使用TSAN_OPTIONS="suppressions=supp.txt"環境變數集運行您的測驗。suppresion 檔案的格式有一個稀疏的檔案。另一個編譯時選項使用-fsanitize-ignorelist它應該禁用檢測本身。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/360075.html
