2011-12-13 36 views
13

Theo trang this, người ta có thể sử dụng các biến loại volatile sig_atomic_t bên trong trình xử lý tín hiệu. Bây giờ câu hỏi của tôi là, ví dụ như một cái gì đó giống như mã sau vẫn còn nguyên tử và do đó không giới thiệu điều kiện chủng tộc?Sử dụng đúng sig_atomic_t dễ bay hơi

Giả sử rằng chúng tôi đang sử dụng bộ xử lý đa lõi (EDIT: chạy chương trình đa luồng). Hiện volatile sig_atomic_t thậm chí làm việc cho hệ thống đa lõi ở nơi đầu tiên hay chúng ta nên sử dụng atomic<unsigned int> của C++ 11 cho bộ xử lý tín hiệu trên hệ thống đa lõi (EDIT: chạy chương trình đa luồng)?

volatile sig_atomic_t a; 

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

Câu hỏi của bạn đã được trả lời ("Có sig_atomic_t biến động thậm chí làm việc cho các hệ thống đa lõi ở nơi đầu tiên" - không), vì vậy bạn nên chấp nhận câu trả lời được cung cấp. – Bulwersator

Trả lời

15

Trừ khi chương trình của bạn đa luồng, trình xử lý tín hiệu không bao giờ chạy đồng thời với mã khác trong chương trình của bạn và chắc chắn không bao giờ chạy đồng thời với mã mà chúng đã bị gián đoạn. Mã của bạn là tốt miễn là tín hiệu sig được đeo mặt nạ trong suốt thời gian xử lý tín hiệu.

+2

Chương trình của tôi đa luồng. – MetallicPriest

+18

Vậy thì 'sig_atomic_t' không liên quan gì đến khía cạnh đa luồng. Nó chỉ có liên quan để đảm bảo nguyên tử hoạt động bị ngắt bởi bộ xử lý tín hiệu * trong cùng một luồng *, tức là để đảm bảo rằng bạn không nhận được chuỗi như: (1) luồng chương trình chính ghi byte cao, (2) bộ xử lý tín hiệu ghi giá trị mới cho toàn bộ biến và trả về, (3) luồng chương trình chính ghi byte thấp (do gián đoạn bởi một tín hiệu giữa các phần ghi). –

Các vấn đề liên quan