2011-11-05 98 views
0

在linux上,我有一個安裝程序,在其中產生了一個使用SIGPROF信號爲採樣分析器啓動其父線程的分析器線程。我明確發送信號,而不是依賴setitimer來獲得更好的控制。我可能需要重新考慮這一點,但現在假設我自己發送信號。只有當線程正在運行時才發送信號給線程

我的問題是,它始終發送信號,即使被配置線程正在系統調用中休眠。這樣,我的樣品環緩衝液就會出現不足。

是否有某種方法可以檢測配置線程的運行狀態,即使它在檢查後可能會立即發生變化?或者更好的是,發送一個信號,使目標處於運行狀態?

我可以排序的假貨通過原子遞增的異形線的信號處理程序計數器,並檢查它是否是一個從探查線程改變:

 
    volatile int samples; 
    while(1) { 
    int old_samples = samples; 
    pthread_kill(profiled_thread, SIGPROF); 
    while (samples == old_samples) 
     usleep(appropriate amount); 
    } 

或東西,但我不知道是否有一個更好的辦法。 (上面的代碼簡化了延遲計算,因爲實際上整個點都是無偏樣本,但現在忽略)。

回答

0

我實際上認爲系統調用期間的中斷是一件好事,如果你可以在那裏對棧進行採樣時間,如this post(第7,1點)。 更重要的是,獲取大量樣本沒有特別的價值(第5,9點)。

0

有幾個問題,我看到的代碼。

1)對變量樣本使用volatile不能保證從將它分配給old_samples到while語句時沒有競爭條件。除非這是你想要的,否則陳舊的價值。 ;-)

2)pthread_kill()似乎是向特定線程發送信號的正確方法。但是,您如何知道在發送另一個信號之前它會被處理?隊列信號有多長?信號線程「信號」能夠返回(有條件等待某種類型)它已經處理了信號嗎?某種生產者/消費者類型掛起的信號變量?