2011-04-03 58 views
3

我有一種情況,即在某些情況下,信號處理程序需要返回而不自己屏蔽,即在返回信號應保持阻塞在線程的信號屏蔽後。跳出longjmp的信號處理程序將不起作用,因爲我需要返回到像正常信號處理程序返回一樣中斷的確切點。是否有任何符合要求的方式來執行此操作,但使用從標準中刪除的ucontext_t?我不能更改信號處理程序或處置;所有的效果必須是線程本地的。從信號處理程序返回並將信號屏蔽

這段代碼的目的是處理一些原子操作和潛在的競態條件或死鎖。基本上,可能中斷代碼如下所示:

atomic_write(&thread_local_flag, 1); 
atomic_dec(&global_counter); 

如果該標誌已設置和計數器遞減,一切都很好,信號處理程序無關,但信號可以在兩個指令之間可能到達。在這種情況下,信號處理程序希望立即返回並讓遞減繼續,但進程正在被信號轟炸(旨在被所有線程接收以實現神祕的同步目的),並且有可能永遠循環(或在至少無限時間)處理信號,而其他線程永遠不會收到它們的信號。

如果我可以讓信號處理程序返回時阻塞信號,那就沒有問題了。

回答

0

嗯,迄今爲止發現的最好的..這似乎工作,並不取決於任何ucontext函數,只是沒有刪除的結構。在信號處理程序:

if (thread_local_flag) { 
    sigaddset(&((ucontext_t *)ctx)->uc_sigmask, sig); 
    return; 
} 

這裏sigctx是第一和第三個參數SA_SIGINFO型信號處理程序,分別。

任何想法是否這是正確的用法或一個可怕的黑客(或兩者)?