需要挥发性吗?

时间:2013-01-21 15:18:19

标签: multithreading gcc locking c99 volatile

我有一个更新结构的功能,还可以禁用中断。

bool readBuffer()
{
    __disable_irq();

    rb->reader += 1; // Just an example

    __enable_irq();

    return true;
}

由于禁用了中断,因此在更新结构中的值时,不可能抢占另一个中断。

但是我还应该将读者变量标记为volatile吗?从理论上讲,当我进入函数时,其他中断可以抢占,但在实际调用__disable_irq()之前。当我的函数恢复时,rb->reader的缓存值将不正确。或者编译器(GCC)是否生成不缓存rb->reader的代码,直到该行实际被命中?

1 个答案:

答案 0 :(得分:1)

可能会更好地指定显式优化障碍:

bool readBuffer()
{
    __disable_irq();
    asm volatile ("" ::: "memory"); // Some unexpected memory modification
    rb->reader += 1; // Just an example
    __enable_irq();
    return true;
}

如果在某些其他情况下您希望编译器优化rb->reader变量,并将其标记为volatile,那将是有利可图的。