zoukankan      html  css  js  c++  java
  • C#学习——valatile关键字

    valatile关键字指示一个字段可能被同时执行的多个线程修改。出于性能原因,编译器,运行时系统甚至硬件可能重新安排对内存位置的读取和写入。声明为valatile的字段不受这些优化的约束。添加volatile修饰符可确保所有线程将按照执行顺序对其它任何线程执行的volatile写入进行观察,从执行的所有线程来看,不能保证valatile写入的整体顺序。

    volatile关键字可以应用于以下类型的字段:

      引用类型。

      指针类型(在不安全的上下文中)。请注意,尽管指针本身可以是易失性的,但其指向的对象却不能。换句话说,您不能声明“ volatile的指针”。

           简单类型,例如sbyte,byte,short,ushort,int,uint,char,float和bool。

          具有以下基本类型之一的枚举类型:byte,sbyte,short,ushort,int或uint。 通用类型参数已知为引用类型。

       IntPtrUIntPtr

    其他类型(包括double和long)不能标记为volatile,因为不能保证对这些类型的字段进行读写。若要保护对这些类型的字段的多线程访问,请使用Interlocked类成员或使用lock语句保护访问

    注意:volatile关键字只能应用于类(class)或结构(struct)的字段。局部变量不能声明为volatile。  

    下面的示例演示如何将公共字段变量声明为volatile。

    class VolatileTest
    {
        public volatile int sharedStorage;
    
        public void Test(int _i)
        {
            sharedStorage = _i;
        }
    }

    下面的示例演示如何创建辅助线程(auxiliray thread 或者较 worker thread ),以及如何使用该辅助线程与主线程并行执行处理。有关多线程的更多信息,请参见托管线程(Managed Threading)

     

    public class Worker
    {
        // This method is called when the thread is started.
        public void DoWork()
        {
            bool work = false;
            while (!_shouldStop)
            {
                work = !work; // simulate some work
            }
            Console.WriteLine("Worker thread: terminating gracefully.");
        }
        public void RequestStop()
        {
            _shouldStop = true;
        }
        // Keyword volatile is used as a hint to the compiler that this data
        // member is accessed by multiple threads.
        private volatile bool _shouldStop;
    }
    
    public class WorkerThreadExample
    {
        public static void Main()
        {
            // Create the worker thread object. This does not start the thread.
            Worker workerObject = new Worker();
            Thread workerThread = new Thread(workerObject.DoWork);
    
            // Start the worker thread.
            workerThread.Start();
            Console.WriteLine("Main thread: starting worker thread...");
    
            // Loop until the worker thread activates.
            while (!workerThread.IsAlive)
                ;
    
            // Put the main thread to sleep for 500 milliseconds to
            // allow the worker thread to do some work.
            Thread.Sleep(500);
    
            // Request that the worker thread stop itself.
            workerObject.RequestStop();
    
            // Use the Thread.Join method to block the current thread
            // until the object's thread terminates.
            workerThread.Join();
            Console.WriteLine("Main thread: worker thread has terminated.");
        }
        // Sample output:
        // Main thread: starting worker thread...
        // Worker thread: terminating gracefully.
        // Main thread: worker thread has terminated.
    }

     

  • 相关阅读:
    yii2 gii 命令行自动生成控制器和模型
    控制器中的方法命名规范
    Vue Property or method "" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based
    IDEA插件:GsonFormat
    Spring Boot : Access denied for user ''@'localhost' (using password: NO)
    Typora添加主题
    Git基础命令图解
    Java Joda-Time 处理时间工具类(JDK1.7以上)
    Java日期工具类(基于JDK1.7版本)
    Oracle SQL Developer 连接Oracle出现【 状态: 失败 -测试失败: ORA-01017: invalid username/password; logon denied】
  • 原文地址:https://www.cnblogs.com/sy-liu/p/13084078.html
Copyright © 2011-2022 走看看