2010-06-23 58 views
4

在編譯時試圖找出線程問題有沒有意義?查找線程錯誤

我說的數據競爭,死鎖,損壞狀態等等

+1

如果你有一個工具指出你在編譯時線程問題,我會說,*「Offcourse」* ?! – 2010-06-23 07:45:58

回答

2

雖然我不知道有明確的線程安全診斷選項的任何編譯器,Coverity的是靜態分析工具,它確實爲併發問題提供跳棋,它通過在運行時不能被做可能是鬆散堪比「編譯時「,因爲編譯器是一個工具,它在生成代碼之前會對來過程的有效性做一些靜態分析,而這似乎是你正在尋找的東西,並不一定與編譯時間相關,即在生成代碼之前...

如果靜態分析工具瞭解併發原語,那麼可以對線程問題進行靜態分析。無論工具/編譯器是否處於正確指出這些問題的地步,我仍有待體驗。

注意:在工作中,我們使用Coverity進行靜態分析,但是當我們瀏覽該工具指向的所有「問題」時,我們還沒有啓用併發檢查器,因此我無法給出任何關於它如何工作的證明。至於其他更常見的棋子,他們指出了一些有效的問題,以及一些無害的問題,以及一些誤報。我希望儘快檢查併發檢查器的輸出以判斷自己的有用性。

4

雖然這不是編譯時,你可能會想看看Helgrind

概述

Helgrind是 檢測C, C++同步錯誤和Fortran一個Valgrind的工具使用POSIX pthreads線程原語的程序。

在POSIX的主要抽象 pthreads的是:一組線程共享 一個公共地址空間,螺紋 創建,螺紋接合,螺紋出口處, 互斥(鎖),條件變量 的(線程間事件通知) , 讀寫器鎖,自旋鎖, 信號量和障礙。

Helgrind可以檢測三類 錯誤,其詳細 在接下來的三個部分中討論的:

的POSIX API並行線程的
  1. 誤用。
  2. 鎖定順序問題引起的潛在死鎖。
  3. 數據競賽 - 訪問內存時沒有足夠的鎖定或同步。

喜歡這些問題通常導致 不能再生,與時間相關的 崩潰,死鎖等 不當行爲,並且可能難以 查找其它手段。

Helgrind知道所有pthread 抽象並儘可能準確地跟蹤其效果 。在x86和 amd64平臺上,它理解並且 部分處理因使用LOCK 指令前綴而產生的隱式鎖定 。

當您的 應用程序僅使用POSIX pthreads API時,Helgrind的效果最佳。但是,如果您想要 使用自定義線程原語,則您可以使用helgrind.h中定義的ANNOTATE_ *宏 將其行爲描述爲 Helgrind。 Valgrind的版本 3.5.0中添加了這個功能,並且被認爲是實驗性的。

由於Boost.Threads基於POSIX pthreads(至少在Linux上),我猜測它也可以。