C#多线程同步(九)【volatile】

C# volatile 理解 浅谈对C# volatile关键字的理解        一、MSDN解释: The volatile keyword indicates that a field might be modified by multiple threads that are executing at the same time. Fields that are declared volatile are 阅读详情

每个人都是自己的上帝。如果你自己都放弃自己了,还有谁会救你?每个人都在忙,有的忙着生,有的忙着死。忙着追名逐利的你,忙着柴米油盐的你,停下来想一秒:你的大脑,是不是已经被体制化了?你的上帝在哪里?


#

 class Test
    {
        //volatile多用于多线程的环境,当一个变量定义为volatile时,读取这个变量的值时候每次都是从momery里面读取而不是从cache读。
        //这样做是为了保证读取该变量的信息都是最新的,而无论其他线程如何更新这个变量。


        //volatile 修饰符通常用于由多个线程访问但不使用 lock 语句对访问进行序列化的字段。
        //volatile 关键字可应用于以下类型的字段:
        //引用类型。
        //指针类型(在不安全的上下文中)。 请注意,虽然指针本身可以是可变的,但是它指向的对象不能是可变的。 换句话说,您无法声明“指向可变对象的指针”。
        //类型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。
        //具有以下基类型之一的枚举类型:byte、sbyte、short、ushort、int 或 uint。
        //已知为引用类型的泛型类型参数。
        //IntPtr 和 UIntPtr。
        //可变关键字仅可应用于类或结构字段。 不能将局部变量声明为 volatile。

        static volatile bool _isCompleted = false;

        static void UserModeWait()
        {
            while (!_isCompleted)
            {
                Console.Write("②.");
            }
            Console.WriteLine();
            Console.WriteLine("③等待完成");
        }

        static void HybridSpinWait()
        {
            //自旋等待
            //一个轻量同步类型(结构体),提供对基于自旋的等待的支持。SpinWait只有在多核处理器下才具有使用意义。在单处理器下,自旋转会占据CPU时间,却做不了任何事。
            //SpinWait并没有设计为让多个任务或线程并发使用。因此,如果多个任务或者线程通过SpinWait的方法进行自旋,那么每一个任务或线程都应该使用自己的SpinWait实例。
            var w = new SpinWait();
            while (!_isCompleted)
            {
                // 执行单一自旋。
                w.SpinOnce();
                // 判断对SpinWait.SpinOnce() 的下一次调用是否触发上下文切换和内核转换。
                //由NextSpinWillYield属性代码可知,若SpinWait运行在单核计算机上,它总是进行上下文切换(让出处理器)。
                //SpinWait不仅仅是一个空循环。它经过了精心实现,可以针对一般情况提供正确的旋转行为以避免内核事件所需的高开销的上下文切换和内核转换;
                //在旋转时间足够长的情况下自行启动上下文切换,SpinWait甚至还会在多核计算机上产生线程的时间片(Thread.Yield())以防止等待线程阻塞高优先级的线程或垃圾回收器线程。
                Console.WriteLine("是否触发上下文切换和内核转换: "+w.NextSpinWillYield);
            }
            Console.WriteLine("③等待完成");
        }

        public static void RunTest()
        {
            var t1 = new Thread(UserModeWait);
            var t2 = new Thread(HybridSpinWait);

            Console.WriteLine("①运行用户模式等待");
            t1.Start();

            //将当前执行RunTest()方法线程挂起指定的时间。 让t1线程执行输出②.
            Thread.Sleep(1);
            _isCompleted = true;

            //将当前线程阻塞指定的时间
            Thread.Sleep(TimeSpan.FromSeconds(1));
            _isCompleted = false;


            Console.WriteLine("①运行混合SpinWait构造 等待");
            t2.Start();
            Thread.Sleep(5);
            _isCompleted = true;

            Console.ReadKey();
        }
    }

运行结果如图:

这里写图片描述

C# volatile 使用详解 阅读详情

相关推荐

多线程之可见性:volatile

一.什么是volatile,它的作用是什么 我们知道线程安全的三大核心就是原子性、可见性和顺序性,synchronized可以实现原子性,而volatile就是来实现可见性。 那么什么是可见性呢? 我们知道,在现代计算机中,由于 CPU 直接从主内存中读取数据的效率不高,所以都会对应的 CPU 高速缓存,先将主内存中的数据读取到缓存中,线程修改数据之后首先更新到缓存,之后才会更新到主内存。如...

striveb的博客 2256

细说.NET中的多线程 (六 使用MemoryBarrier,Volatile进行同步)

上一节介绍了使用信号量进行同步,本节主要介绍一些非阻塞同步的方法。本节主要介绍MemoryBarrier,volatile,Interlocked。 MemoryBarriers 本文简单的介绍一下这两个概念,假设下面的代码: using System; class Foo { int _answer; bool _complete; void A(...

weixin_30709061的博客 285

C#学习笔记 线程同步

多个线程同时操作一个数据的话,可能会发生数据的错误。这个时候就需要进行线程同步了。用户模式同步构造易变构造CLR保证4字节以下的基本类型的读写是原子性的,也就是说这些变量的值都会一次性被读取或者写入。但是64位的值比如Int64和Double,就不是原子读写的了。这样的变量在机器级别上,可能需要两次读写才能完成。另外由于编译器的优化,一些变量的读写顺序可能和实际执行的顺序不同。这会导致一些在单线程下

乐百川 950

编译器优化对多线程数据同步的影响(volatile详解实验二)

首先,这里没有博主的傻逼! 由此可见(C语言volatile关键字详解),编译器优化会对多线程数据同步有影响,我们深入程序输出以及汇编程序去探讨为什么会产生影响!并解决问题 1.上代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h&...

weixin_38815998的博客 2692

麒麟 ARMv10 SP3 安装 Oracle 19c 官方文档 或 教程

在麒麟ARMv10 SP3系统上安装Oracle 19c需要特别注意架构兼容性。

qq_43032338的博客 2941

从零开始用QP框架开发STM32:事件驱动编程实战指南(附状态机设计技巧)

本文详细介绍了如何使用QP框架在STM32上实现事件驱动编程,包括状态机设计技巧和嵌入式开发实践。通过对比传统前后台系统和RTOS,展示了QP框架在资源占用、实时性和代码可维护性方面的优势,并提供了从环境搭建到高级状态机设计的完整指南。

h6i7j8的博客 1173

轻量级同步机制:volatile关键字

volatile的作用 可以强制让线程从公共内存中读取,而不是从工作内存读取。 volatile非原子性

qq_45910900的博客 244

手把手教你搞定EMC EFT测试:从电源线到信号线的完整整改实战(附常见失败原因)

本文详细解析了EMC EFT测试中的常见问题及整改措施,从电源线到信号线的完整实战方案。通过四步定位法和成本最优整改策略,帮助工程师有效应对电快速脉冲群干扰,提升产品通过率并降低成本。

weixin_30920597的博客 498

线程同步之Volatile

编译器优化 c#编译器会在不改变我们的意图的情况下做一些优化,比如: a = 1; a = 2; 编译器编译之后,可能就只剩下第二行了。 再比如: a = 1; b = a; 编译器优化后,可能会把第二行优化成b = 1 再比如: a = m; b = n; 编译器生成IL时,有可能会改变两行代码的顺序。 以上变化都是在编译器认为不改变作者意图的前提下做的,如果在单线程环境下这也没有问题,但是如果是多线程环境操作一个公共资源的话,先读后读或先写后写,都可能会造成不确定的结果。 运行时优化 在运行时,为

目标:MVP 722

基于Java的高校学生信息管理系统的设计与实现(论文+源码)

可以对本系统的数据进行良好的封装,Java可以对不想被访问的数据进行良好的隐藏,具备平台无关性,可移植,更加可靠与安全,具备多线程支持,进行网络交互更容易。它支持本系统的B/S模式。开发效益方面,本系统一旦开发成功并且面向社会,就会让大多数的学生教师体会到便利办公的乐趣,随之促进提高本系统的使用率和经济利润,所以在经济方面,对于零成本开发且高利润的学生管理系统是可行的。学生可以在学生端进行选课,查看自己的成绩,教师可以在教师端查看所任课程的选课情况,对学生成绩进行录入,对所任的课程进行结课等操作。

2402_82389843的博客 1094

Supervisor 安装与使用

一、Supervisor 介绍 Supervisor 是一个用 Python 编写的进程管理工具,它可以用于监控和控制类 UNIX 操作系统上的多个进程。它是一个客户端/服务器系统,其中 Supervisor 的服务器端称为 supervisord,负责启动管理的子进程、响应客户端命令、重启崩溃或退出的子进程、记录子进程的 stdout 和 stderr 输出,以及处理子进程生命周期中的事件。客...

疯子丶pony的博客 3864

C#线程同步的几种方法

我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在 后台处理一大堆数据,但还要使用户界面处于可操作状态;或者你的程序需要访问一些外部资源如数据库或网络文件等。这些情况你都可以创建一个子线程去处理, 然而,多线程不可避免地会带来一个问题,就是线程同步的问题。如果这个问题处理不好,我们就会得到一些非预期的结果。在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳。volatile是最简单的一种同步方法,当然简单是要付出代价的。

积累点滴,保持自我 8397

Zotero on Mac: 高效文献管理与引用指南

本文为Mac用户提供了一份全面的Zotero高效文献管理与引用指南。从安装配置、文献收集管理、PDF深度阅读与笔记,到在Word中无缝插入引用和生成参考文献,详细讲解了核心工作流。同时推荐了ZotFile、Better BibTeX等必备插件,并介绍了利用同步与WebDAV实现跨设备无缝衔接的方法,助力研究者构建个人数字知识库,极大提升学术研究效率。

weixin_29281941的博客 1179

C#中的volatile关键字

volatile关键字指示一个字段可以由多个同时执行的线程修改。 声明为 volatile的字段不受编译器优化(假定由单个线程访问)的限制。 这样可以确保该字段在任何时间呈现的都是最新的值。 volatile修饰符通常用于由多个线程访问、但不使用 lock 语句对访问进行序列化的字段。 volatile关键字可应用于以下类型的字段: 引用类型。 指针类型(在不安全的上下文中)。 请注意,虽然指针本身可以是可变的,但是它指向的对象不能是可变的。换句话说,不能声明“指向可变对象的指针”。 类型,如 sbyte

极客神殿 4941

Python3.8下MvCameraControl.dll加载失败?3种方法彻底解决FileNotFoundError

本文针对Python3.8及以上版本在Windows平台调用MvCameraControl.dll时出现的FileNotFoundError问题,深入剖析了其根源在于Python 3.8引入的DLL加载安全机制变更。文章提供了三种核心解决方案:显式指定DLL完整路径、使用os.add_dll_directory()添加可信目录,以及利用ctypes的winmode参数进行精细控制,并给出了工程化封装建议,帮助开发者彻底解决此兼容性问题。

weixin_29093017的博客 191

ardupilot 日志分析《xKF1信息》

ardupilot 日志分析系列将会把ardupilot所有的日志文档进行分析,为我们分析无人机的运行状态,炸鸡原因,传感器状态,电机状态,控制信息,滤波信息做准备。本节主要分析xKF1日志信息,欢迎批评指正。学习好ardupilot必须会分析飞行日志,从飞行日志中我们可以学到很多无人机的知识。无人机是综合知识的体现,涵盖:导航、控制、滤波、算法、协议等各种知识,只有更全面的学习,才能在无人机的道路上越走越远。

陌城烟雨 1226

C#关键字volatile

在这个例子中,count字段被声明为volatile。在这里,hasData变量被声明为volatile,确保了生产者线程对hasData的修改能够被消费者线程及时看到,并且消费者线程对hasData的修改也能被生产者线程及时看到,从而保证了生产者 - 消费者模式的正确运行。例如,有两个线程,一个线程(线程 A)在不断地更新一个共享变量的值,另一个线程(线程 B)在读取这个共享变量的值。因为它要求对变量的每次访问都直接从主内存中进行,而不是从线程的工作内存(缓存)中进行,这会增加内存访问的开销。

2401_83367969的博客 2148

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C# volatile ,lock解析

http://mxmkeep.blog.163.com/blog/static/10649241520096410448715/ (C# 参考)volatile,lock,synchronized C#2009-07-04 10:04:48阅读54评论0字号:大中小C# 参考)volatile,lock,synchronized volatile(C# 参考)volatile 关键字表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该

pretyjfh的专栏 7522

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# 中多线程间的同步

一、引入先给出一个Num类的定义internalclassNum { publicstaticintodd=50000; publicstaticinteven=10000; }假设现在要求输出小于 odd 的所有奇数,输出小于 even 的所有偶数,不考虑多线程时可以写出如下的代码:(为了演示多线程时线程间的争用,先把值赋给了 num,实际上这个赋值操作毫无...

weixin_68436326的博客 1041

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# Volatile

C# Volatile

我的英文站点:https://iorilan.medium.com/ 1884

c#中多线程修饰符volatile

volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。 1、volatile的使用场景 多个线程同时访问一个变量,CLR为了效率,允许每个线程进行本地缓存,这就导致了变量的不一致性。volatile就是为了解决这个问题,volat

兰丝龙 专栏 6224

C# Volatile关键字详解

特性说明作用确保字段的可见性和禁止重排序适用简单的布尔标志、状态开关等不适用复合操作、大对象、非原子类型(如long在 32 位平台)替代优先考虑或锁机制关键点volatile ≠ 线程安全,只是内存模型的一部分📌最佳实践:除非你非常清楚自己在做什么,否则对于多线程共享状态,优先使用lock或,而不是依赖volatile。

qq_44967213的博客 587

C# 特性之volatile

C# 2.0特性:Volatile volatile关键字指示一个字段可以由多个同时执行的线程修改。出于性能原因,编译器,运行时系统甚至硬件都可能重新排列对存储器位置的读取和写入。声明了volatile的字段不进行这些优化。添加volatile修饰符可确保所有线程观察易失性写入操作(由任何其他线程执行)时的观察顺序与写入操作的执行顺序一致。不确保从所有执行线程整体来看时所有易失...

weixin_30385925的博客 340

C# volatile关键字

本文仅为个人参考众多文章后的理解,如有错误请指正,红色内容必看。 volatile使用: private volatile int intValue; private volatile List<string> strValues; private volatile FormWindowState style; private volatile IntPtr mai...

窝。。。 2618

C#基础 关键字之volatile

volatile基础 msdn的解释:http://msdn.microsoft.com/zh-cn/library/x13ttww7.aspx volatile 关键字指示一个字段可以由多个同时执行的线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。 volatile 修饰符通常用于由多个线程访问但不使用 lock 语句对访问进行序列化的字段。有关在多线程方案中使用 volatile 的示例,请参见如何:创建和终止线程(C

Ca_va的博客 300
上一篇: C#多线程同步(八)【ReaderWriterLockSlim】
下一篇: jQuery实现的地址选择
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值