`
kenby
  • 浏览: 716748 次
  • 性别: 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变量

    主要介绍了Linux C中多线程与volatile变量的相关资料,需要的朋友可以参考下

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

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

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

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

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

    主要为大家详细并深入的探讨Java多线程中的volatile变量,volatile用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新,感兴趣的小伙伴们可以参考一下

    Java多线程编程总结

    Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程...

    java多线程编程总结

    详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...

    java多线程编程之慎重使用volatile关键字

    volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,下面看一下为什么要慎重使用volatile关键字

    C#中volatile与lock用法

    volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。 1、volatile的使用...

    java多线程笔记

    Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 13 Java线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的调度-合并 22 Java线程:线程的调度-终止线程 25 Java线程:...

    concurrent 多线程 教材

    j-concurrent 00 IBM developerWorks 中国 : Java 多线程与并发编程专题 02 Java 程序中的多线程 03 编写多线程的 Java 应用程序 ...37 Java 理论与实践 正确使用 Volatile 变量.mht 38 使用泛型和并发改善集合.mht

    Java 多线程编程面试集锦20道问题解答Java多线程编程高难度面试题及解析

    本篇文章提供了20道高难度的Java多线程编程面试题及详细解析,旨在帮助开发者展示出卓越的并发编程能力。在当今高并发的应用场景下,对多线程编程的理解和应用是评估面试者的重要指标。通过这些高难度问题,您将全面...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    线程安全在Java中的应用与实践.pptx.pptx

    volatile关键字可以保证变量的可见性,当一个线程修改了volatile变量的值,新值对于其他线程来说是立即可见的,这样可以防止由于线程间的数据不一致导致的问题 Lock接口 Lock接口提供了比synchronized关键字更广泛的...

    Java学习源码Java多线程的代码

    在char01包里放置Java多线程基本知识的代码。内容如下: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 在char02包里放置了Java对变量和对象并发访问的知识的代码...

    嵌入式系统/ARM技术中的volatile在多线程中的应用

    volatile是一个关键字,用来修饰一个变量,告诉编译器在编译的时候不要对其进行优化,在操作寄存器和多线程中这种用法是最常见的。  有这样一个例子:  #include  #include  void my_func();  int? i; ...

    经典嵌入式笔试题

    经典嵌入式笔试题 8. 关键字volatile有什么含意?并给出三个不同的例子。 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了...3) 多线程应用中被几个任务共享的变量

    单片机与DSP中的单片机中volatile定义的作用

    下面是volatile变量的几个例子:  1). 并行设备的硬件寄存器(如:状态寄存器)  2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)  3). 多线程应用中被几个任务共享的变量  回答...

Global site tag (gtag.js) - Google Analytics