2011-09-30 29 views
-1

我正在創建一個實現搶先式循環調度程序的用戶級線程庫。我有這樣的處理函數:sighandler中的問題

void handler(int signum) 
{ 
    gtthread_yield(); 
} 

在gtthread_yield中,我正在做上下文切換切換到下一個要執行的線程。該邏輯在大多數情況下工作正常。但是,即使在gtthread_yield函數(從sighandler調用)可以完成執行之前,信號仍然出現時,我會遇到分段錯誤。正因爲如此,我的訪問代碼(即我已經釋放的內存)無效的內存位置

有什麼辦法避免處理程序gtthread_yield功能執行完畢之前被提出?

由於

+0

什麼gtthread_yield?是異步信號安全? – Kevin

+0

不,它不是,它只是一個正常的功能 – CuriousCoder

回答

1

使用sigaction()及其幫助程序(sigemptyset(),sigfillset(),sigaddset()等)在處理程序正在進行時阻止信號。這可能是一個必要的步驟;這可能是不夠的。如果不夠用,您可能需要修改信號處理,以便在返回之前除了變量volatile sig_atomic_t之外幾乎什麼也不做。然後調用代碼已經看原子變量,並調用gtthread_yield()當設置(記住從gtthread_yield()返回後清除變量。