`
kenby
  • 浏览: 724566 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程与volatile变量

 
阅读更多

 

volatile 修饰的变量表示改变量的值是易变的,编译器不对其进行优化,

访问该变量的时候不会从寄存器读取, 而是直接从内存读取变量。


在多线程环境下,每个线程都有一个独立的寄存器,用于保存当前执行的指令。

假设我们定义了一个全局变量,每个线程都会访问这个全局变量,这时候线程的

寄存器可能会存储全量变量的当前值用于后续的访问。当某个线程修改了全局变

量的值时,系统会立即更新该线程寄存器中对应的值,其他线程并不知道这个全局

变量已经修改,可能还是从寄存器中获取这个变量的值,这个时候就会存在不一致

的情况。


针对多线程访问共享变量而且变量还会经常变化的情况,利用volatile类型修饰变量

是一个很好的选择,如volatile int size = 10; 当多线程访问这个变量时,它会直接从

size对应的地址访问,而不会从线程对应的寄存器访问,这样就不会出现前面说到的

同一变量的值在多个线程之间不一致的情况。


下面贴出一个多线程环境下使用 volatile 变量的例子:

 

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

/* volatile变量控制线程的运行与结束 */
static volatile int do_run_thread = 1;  

static pthread_t thread_tid;

static void *work_thread(void *arg)
{
    while (do_run_thread) {
        printf("thread is running...\n");
        sleep(1);
    }
    printf("stop thread done!\n");
}

static void start_thread()
{
    printf("start thread...\n");
    pthread_create(&thread_tid, NULL, work_thread, NULL);
}

static void stop_thread()
{
    printf("stop thread...\n");
    do_run_thread = 0;
    pthread_join(thread_tid, NULL); /* 等待线程结束 */
}

int main()
{
    start_thread();
    sleep(5);
    stop_thread();

    return 0;
}
分享到:
评论
1 楼 joeytang 2014-05-30  
 

相关推荐

    Linux C中多线程与volatile变量

    综上所述,`volatile`在Linux C多线程编程中主要用于解决共享变量的可见性问题,但在处理多线程同步时,还需要结合其他的同步机制,如互斥锁(`mutex`)、条件变量等,以确保线程安全。理解`volatile`的关键在于它是...

    Java线程:volatile关键字

    volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。 正确使用 volatile 变量的条件是:对变量的写操作不依赖于当前值,以及该变量...

    深入探讨Java多线程中的volatile变量共6页.pd

    本资料《深入探讨Java多线程中的volatile变量》将带你深入理解这个概念,全面解析其工作原理和实际应用。 volatile关键字在Java中主要用于解决多线程环境下的可见性和有序性问题。它确保了被volatile修饰的变量对...

    volatile 变量的说明

    volatile变量在编程语言中,尤其是Java和C/C++中,是一种特殊的标识符,用于指示编译器该变量的值可能在编译器不知情的情况下发生变化。这个关键字的主要作用是告诉编译器不要对这个变量进行优化,每次使用时都需要...

    深入探讨Java多线程中的volatile变量

    Java多线程中的volatile变量是实现线程间通信的关键机制之一。它主要用于解决并发环境下的可见性和有序性问题,但不保证原子性。在多线程编程中,当多个线程共享同一变量时,可能会遇到数据不一致的问题,因为每个...

    stm32 volatile变量的正确使用

    ### STM32中Volatile变量的正确使用 #### 概述 在嵌入式系统编程中,`volatile`关键字的正确使用对于确保程序的稳定性和可靠性至关重要。它主要用于标记那些可能在程序运行过程中被外部因素(如硬件中断、多线程...

    java多线程_java多线程下变量共享_

    3. `Atomic`类:Java并发包(`java.util.concurrent.atomic`)提供了如`AtomicInteger`、`AtomicLong`等原子类,它们提供了原子操作,如`incrementAndGet()`,在多线程环境下可以替代`synchronized`和`volatile`...

    volatile变量

    ### volatile变量详解 #### 一、volatile的基本概念与作用 `volatile`是一个在编程语言中常用的关键词,尤其是在C/C++中。它用于定义一个变量,表明该变量可能会被意想不到的方式改变,这种改变可能是由硬件、中断...

    并发编程基础知识,java内存模型及多线程、volatile

    在单线程环境中,代码按顺序执行,但在多线程环境中,由于指令重排序等原因,可能导致执行顺序与代码编写顺序不一致。JMM提供了一些规则来保证有序性,例如Happen-Before规则。 ##### 指令重排 指令重排是为了提高...

    Java 理论与实践: 正确使用 volatile 变量 线程同步

     这样当多个线程同时与某个对象交互时,必须要注意到要让线程及时的得到共享成员变量的变化。  而volatile关键字是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。  使用建议:...

    java入门教程:数据类型_Java理论与实践如何正确使用Volatile变量.docx

    ### Java入门教程:数据类型与正确使用Volatile变量 #### 概述 在Java编程语言中,`volatile`关键字提供了一种轻量级的同步机制,用于确保共享变量的可见性和一定程度上的线程安全性。相比于传统的锁机制如`...

    学习Java多线程之volatile域

    Java多线程中的volatile关键字是Java提供的一个较弱的同步机制,用于解决多线程环境下的数据一致性问题。volatile确保了变量在多个线程之间的可见性,并限制了指令重排序,但并不保证原子性。 首先,理解Java内存...

    Java并发编程(5)volatile变量修饰符-意料之外

    在Java编程语言中,`volatile`关键字是一个非常重要的并发控制机制,它被用来修饰类的成员变量,确保这些变量在多线程环境下的可见性和有序性。然而,使用`volatile`并非总是如我们所期望的那样简单,有时会出现一些...

    这个例子中包含多个线程和一个共享的volatile变量

    SharedData结构包含了一个volatile的布尔型变量isProduced和isConsumed,以及一个整型变量data。 生产者线程负责生产数据并更新isProduced标志。 消费者线程等待isProduced标志为true,然后消费数据并更新isConsumed...

    Volatile详解,深入学习Volatile

    - 多线程同步:在多线程环境中,当一个线程修改了volatile变量,其他线程能立即感知到变化,避免数据不一致。 3. Volatile的使用误区: - volatile不能替代锁:尽管volatile可以保证可见性,但无法保证原子性。...

    volatile变量的的概念和使用

    这意味着在多线程环境下,对`volatile`变量的读写操作仍然可能引发竞态条件。为了确保原子操作,还需要结合使用互斥锁、信号量等同步机制。 在编写驱动程序或嵌入式软件时,正确使用`volatile`可以避免许多难以调试...

    Java多线程 volatile关键字详解

    Java多线程volatile关键字详解 Java多线程volatile关键字详解主要介绍了Java多线程volatile关键字的应用和原理。volatile是一种轻量同步机制,可以确保变量的可见性和顺序性,但不保证原子性。 volatile关键字的...

Global site tag (gtag.js) - Google Analytics