首页 > 其他分享 >Interlocked 为多个线程共享的变量提供原子操作 多线程重入

Interlocked 为多个线程共享的变量提供原子操作 多线程重入

时间:2024-06-12 12:12:59浏览次数:20  
标签:Int32 Thread Exchange 原子 Int64 操作 线程 多线程 Interlocked

Interlocked可以为多个线程共享的变量提供原子操作

主要使用的读写方法

 var runningState=Interlocked.Read(ref isRunning);
Interlocked.Exchange(ref isRunning, 0);

可以配合lock实现业务

常用方法

Add(Int32, Int32)	
对两个 32 位整数进行求和并用和替换第一个整数,上述操作作为一个原子操作完成。

Add(Int64, Int64)	
对两个 64 位整数进行求和并用和替换第一个整数,上述操作作为一个原子操作完成。

CompareExchange(Double, Double, Double)	
比较两个双精度浮点数是否相等,如果相等,则替换第一个值。

CompareExchange(Int32, Int32, Int32)	
比较两个 32 位有符号整数是否相等,如果相等,则替换第一个值。

CompareExchange(Int64, Int64, Int64)	
比较两个 64 位有符号整数是否相等,如果相等,则替换第一个值。

CompareExchange(IntPtr, IntPtr, IntPtr)	
比较两个平台特定的句柄或指针是否相等,如果相等,则替换第一个。

CompareExchange(Object, Object, Object)	
比较两个对象是否引用相等,如果相等,则替换第一个对象。

CompareExchange(Single, Single, Single)	
比较两个单精度浮点数是否相等,如果相等,则替换第一个值。

CompareExchange<T>(T, T, T)	
比较指定的引用类型 T 的两个实例是否引用相等,如果相等,则替换第一个。

Decrement(Int32)	
以原子操作的形式递减指定变量的值并存储结果。

Decrement(Int64)	
以原子操作的形式递减指定变量的值并存储结果。

Exchange(Double, Double)	
以原子操作的形式,将双精度浮点数设置为指定的值并返回原始值。

Exchange(Int32, Int32)	
以原子操作的形式,将 32 位有符号整数设置为指定的值并返回原始值。

Exchange(Int64, Int64)	
以原子操作的形式,将 64 位有符号整数设置为指定的值并返回原始值。

Exchange(IntPtr, IntPtr)	
以原子操作的形式,将平台特定的句柄或指针设置为指定的值并返回原始值。

Exchange(Object, Object)	
以原子操作的形式,将对象设置为指定的值并返回对原始对象的引用。

Exchange(Single, Single)	
以原子操作的形式,将单精度浮点数设置为指定的值并返回原始值。

Exchange<T>(T, T)	
以原子操作的形式,将指定类型 T 的变量设置为指定的值并返回原始值。

Increment(Int32)	
以原子操作的形式递增指定变量的值并存储结果。

Increment(Int64)	
以原子操作的形式递增指定变量的值并存储结果。

MemoryBarrier()	
按如下方式同步内存存取:执行当前线程的处理器在对指令重新排序时,不能采用先执行 MemoryBarrier() 调用之后的内存存取,再执行 MemoryBarrier() 调用之前的内存存取的方式。

MemoryBarrierProcessWide()	
提供覆盖整个过程的内存屏障,确保来自任何 CPU 的读写都不能越过该屏障。

Read(Int64)	
返回一个以原子操作形式加载的 64 位值。

示例

using System;
using System.Threading;

namespace InterlockedExchange_Example
{
    class MyInterlockedExchangeExampleClass
    {
        //0 for false, 1 for true.
        private static int usingResource = 0;

        private const int numThreadIterations = 5;
        private const int numThreads = 10;

        static void Main()
        {
            Thread myThread;
            Random rnd = new Random();

            for(int i = 0; i < numThreads; i++)
            {
                myThread = new Thread(new ThreadStart(MyThreadProc));
                myThread.Name = String.Format("Thread{0}", i + 1);
            
                //Wait a random amount of time before starting next thread.
                Thread.Sleep(rnd.Next(0, 1000));
                myThread.Start();
            }
        }

        private static void MyThreadProc()
        {
            for(int i = 0; i < numThreadIterations; i++)
            {
                UseResource();
            
                //Wait 1 second before next attempt.
                Thread.Sleep(1000);
            }
        }

        //A simple method that denies reentrancy.
        static bool UseResource()
        {
            //0 indicates that the method is not in use.
            if(0 == Interlocked.Exchange(ref usingResource, 1))
            {
                Console.WriteLine("{0} acquired the lock", Thread.CurrentThread.Name);
            
                //Code to access a resource that is not thread safe would go here.
            
                //Simulate some work
                Thread.Sleep(500);

                Console.WriteLine("{0} exiting lock", Thread.CurrentThread.Name);
            
                //Release the lock
                Interlocked.Exchange(ref usingResource, 0);
                return true;
            }
            else
            {
                Console.WriteLine("   {0} was denied the lock", Thread.CurrentThread.Name);
                return false;
            }
        }
    }
}

参考

标签:Int32,Thread,Exchange,原子,Int64,操作,线程,多线程,Interlocked
From: https://www.cnblogs.com/ives/p/18243687

相关文章

  • 【mysql】PROCESSLIST 查看运行中的线程
    发现mysql语句查询响应特别慢,想看一下mysql现时正在做什么事情?通过以下语句,可以看mysql有哪些线程正在运行,也可以帮助定位问题。比如有一些运行特别久的语句。用这个语句看一下:showprocesslistshowfullprocesslist或者用这个语句:select*frominformation_schema.`......
  • 一文带你搞清楚Python的多线程和多进程
    本文分享自华为云社区《Python中的多线程与多进程编程大全【python指南】》,作者:柠檬味拥抱。Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多进程的概念、区别以及如何使用线程池与进程池来......
  • Java多线程CompletableFuture使用
    引言一个接口可能需要调用N个其他服务的接口,这在项目开发中非常常见。如果是串行执行的话,接口的响应速度会很慢。考虑到这些接口之间有大部分都是无前后顺序关联的,可以并行执行。就比如说调用获取商品详情的时候,可以同时调用获取物流信息,通过并行执行多个任务的方式,接口的......
  • Linux——线程池
    目录一、什么是线程池二、线程池的优点三、线程池的应用四、实现一个简单的线程池五、单例模式5.1、饿汉实现方式5.2、 懒汉实现方式5.3、 单例模式实现线程池(懒汉方式)六、其他常见的各种锁一、什么是线程池        线程池是线程的一种使用模式。在前面......
  • 多线程实现并发
    多线程并发服务器架构void*thread_fun(void*arg){ while(1){ recv()/send() } }scokfd=socket()bind()listen()while(1){ accept() //连上就创建线程 pthread_create(,,thread_fun,) pthread_detach()}案例/*#Multi-processconcurren......
  • 线程介绍及其Java如何用Thread 类创建线程和操作线程方法
    目录一、进程和线程1.1进程特征2.2线程特征2.3区别二、利用Thread类创建线程2.1通过创建Thread子类,重写run()方法2.2通过实现Runnable接口,重写run()方法2.3.Callable接口+FutureTask创建线程2.3三种方法区别1.通过创建Thread子类,重写run()方法2.通过实......
  • C#实现多线程的几种方式(附完整源码)
    C#实现多线程的几种方式1.使用Thread类:2.使用ThreadPool类:3.使用Task类:以下是C#中实现多线程的几种常见方式的示例代码:1.使用Thread类:usingSystem;usingSystem.Threading;​classProgram{staticvoidMain(){Threadth......
  • 1_JAVA线程
    Java线程1.创建和运行线程1.1直接使用Thread例如:publicclassThreadTest{publicstaticvoidmain(String[]args){Threadt=newThread(){publicvoidrun(){//要执行的任务System.out.println(Thr......
  • Java多线程(一):多线程基础
    多线程技术概述线程与进程进程:一个内存中运行的应用程序每个进程有一个独立的内存空间线程进程中的一个执行路径·共享一个内存空间·线程间自由切换,并发执行·一个进程至少有一个线程·线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干......
  • 写一个多线程控制工人接活和工作的例子(使用synchronized wait notifyAll)
    packageorg.example;publicclassStudyWaitAndNotify{publicstaticvoidmain(String[]args){WorkManNeedToDoa=newWorkMan();Leaderl1=newLeader(a,25);Leaderl2=newLeader(a,20);Testert1=newTester(a......