信号处理程序和多线程的易失性

2023-12-14

据说信号处理程序需要 volatile,例如,

volatile int flag = 1; // volatile is needed here?

void run() {
    while(flag) { /* do someting... */ }
}

void signal_handler(int sig) {
    flag = 0;
}

int main() {
    signal(SIGINT, sig_handler);
    run();
    // ...
}

据说多线程中往往不使用 volatile。但是多线程中的类似情况又如何呢:

int flag = 1; // is volatile needed here?

void thread_function() {
    while(flag) { /* do someting... */ }
}

int main() {
    // pthread_create() to create thread_function()...
    sleep(10); // let thread_function run for 10 seconds
    flag = 0;
    // ...
}

在这两种情况下都应该使用 volatile 关键字吗?编译器对这两种情况的处理方式是否相同?


唯一允许您从信号处理程序修改的非本地值是类型的值volatile sig_atomic_t和原子类型。特别是写信给您volatile int is not允许,并且如果您的信号处理程序运行,则您有未定义的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信号处理程序和多线程的易失性 的相关文章