c语言volatile的作用详解

volatile是C语言中的一个关键字,用于告诉编译器该变量是易变的,可能会被意外地修改,因此编译器不应该对该变量进行优化。 volatile关键字的作用如下:

禁止编译器优化

当一个变量被声明为volatile时,编译器将不会对其进行优化。因为该变量可能会被外部因素(例如中断)修改,因此编译器不能假设该变量的值不变,必须每次从内存中读取该变量的值。

保证多线程中的内存一致性

在多线程程序中,如果多个线程同时访问同一个变量,为了保证内存的一致性,该变量需要被声明为volatile

与硬件操作相关的变量

在嵌入式程序中,有些变量是与硬件相关的,例如控制寄存器、状态寄存器等,这些变量的值可能会被硬件修改,因此需要被声明为volatile。 下面是一个使用volatile关键字的例子,演示了如何使用volatile来确保多线程程序中的内存一致性:

#include<stdio.h>
#include<pthread.h>
volatile int counter = 0;
void *thread_func(void *arg) {
    int i;
    for(i = 0; i < 1000000; i++) {
        counter++;
    }
    return NULL;
}
int main() {
    pthread_t t1, t2;
    pthread_create(&t1, NULL, thread_func, NULL);
    pthread_create(&t2, NULL, thread_func, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    printf("%d\n", counter);
    return 0;
}

上述代码中,定义了一个volatile类型的全局变量counter,并创建两个线程对其进行累加操作。在main函数中,调用pthread_join函数等待两个线程结束,最后输出counter的值。由于counter被声明为volatile,保证了多线程程序中的内存一致性,因此输出的counter值为2000000。如果没有将counter声明为volatile,则可能出现两个线程同时修改counter的情况,导致输出的counter值小于2000000。