2012-08-24 80 views
1

我想實現一個SIGSEGV上的處理程序,它將收集一些信息,如進程ID,線程ID和回溯,並將這些信息寫入文件/管道/套接字。pthread_spin_trylock在多線程應用程序的sigsegv處理程序內是否安全?

問題在於如果一個線程遇到了SIGSEGV,其他人很快就會出現(可能相當高)​​的可能性。如果兩個線程碰巧把它們寫到他們正在寫出他們的報告的代碼位上,那麼他們將把他們的寫入交叉(到同一個文件)。

我知道,我應該只使用異步信號安全功能作爲signal(7) 詳細的我也看到至少在兩種情況here和視頻在他人已經使用pthread_spin_trylock來解決這個問題,最多的回答here鏈接。

這是防止上述問題的安全方法嗎?

+0

我認爲如果您刪除了'C++'或'c'標記,並且您添加了'race-condition'標記,那會更好。這樣人們可能會更好地知道他們可以給你哪種語言的例子。瞭解種族情況的人可能會對這個問題感興趣。 –

+0

謝謝。我已經按照你的建議去做了,希望吸引合適的人回答我的問題。 – TWMouton

+0

你要寫出哪些信息,核心轉儲不會告訴你? –

回答

0

在大多數系統pthread_spin_trylock將與原子比較並交換(CAS指令是中斷安全的,至少在x86(替他人不能說)來實現。

我可能會使用CAS自己以確保這是發生了什麼 這裏是它的GCC文檔:在你的星座

static int lock = 0; // global scope 

http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html

和示例代碼al處理程序:

if (__sync_bool_compare_and_swap(&lock, 0, 1)) { 
    // Got the lock 
} else 
    pthread_exit(); // terminate this thread