2011-12-13 25 views
13

根據this網站,可以在信號處理程序中使用volatile sig_atomic_t類型的變量。現在我的問題是,例如像下面的代碼仍然是原子,因此沒有競爭條件?正確使用易失性sig_atomic_t

假設我們正在使用多核處理器(編輯:運行多線程程序)。 volatile sig_atomic_t甚至可以用於多核系統,或者我們是否應該使用C++ 11的atomic<unsigned int>來處理多核系統上的信號處理程序(EDIT:運行多線程程序)?

volatile sig_atomic_t a; 

static void signal_handler(int sig, siginfo_t *si, void *unused) 
{ 
    int b; 
    ................ 
    b = ...; 
    a = a | b; 
    ................ 
} 
+0

你的問題得到解答(「volatile volatile sig_atomic_t甚至可以用於多核系統」 - 否),所以你應該接受提供的答案。 – Bulwersator

回答

15

除非你的程序是多線程的,信號處理從來沒有同時與其他代碼在你的程序運行,他們肯定不會與他們所中斷的代碼同時運行。只要信號sig在信號處理程序期間被屏蔽,您的代碼就可以正常工作。

+2

我的程序是多線程的。 – MetallicPriest

+18

那麼'sig_atomic_t'與多線程方面沒有任何關係。它只與確保在同一線程中被信號處理程序中斷的操作的原子性相關,即確保您不會得到如下序列:(1)主程序流寫入高字節,(2)信號處理程序寫入(3)主程序流寫入低字節(由於部分寫入之間的信號中斷)。 –