Interlocked.Exchange Метод

Определение

Задает переменную заданному значению как атомарную операцию.

Перегрузки

Имя Описание
Exchange(UInt16, UInt16)

Задает 16-разрядное целое число со знаком заданному значению и возвращает исходное значение в виде атомарной операции.

Exchange(UInt32, UInt32)

Задает 32-разрядное целое число без знака в указанное значение и возвращает исходное значение в виде атомарной операции.

Exchange(Single, Single)

Задает число с плавающей запятой с одной точностью заданному значению и возвращает исходное значение в виде атомарной операции.

Exchange(UIntPtr, UIntPtr)

Задает целое число без знака собственного размера в указанное значение и возвращает исходное значение в виде атомарной операции.

Exchange(UInt64, UInt64)

Задает 64-разрядное целое число без знака в указанное значение и возвращает исходное значение в виде атомарной операции.

Exchange(SByte, SByte)

Задает 8-разрядное целое число со знаком заданному значению и возвращает исходное значение в виде атомарной операции.

Exchange(Byte, Byte)

Задает 8-разрядное целое число без знака в указанное значение и возвращает исходное значение в виде атомарной операции.

Exchange(IntPtr, IntPtr)

Задает целое число со знаком собственного размера в заданное значение и возвращает исходное значение в виде атомарной операции.

Exchange(Int64, Int64)

Задает 64-разрядное целое число со знаком заданному значению и возвращает исходное значение в виде атомарной операции.

Exchange(Int32, Int32)

Задает 32-разрядное целое число со знаком заданному значению и возвращает исходное значение в виде атомарной операции.

Exchange(Int16, Int16)

Задает 16-разрядное целое число без знака в указанное значение и возвращает исходное значение в виде атомарной операции.

Exchange(Double, Double)

Задает число с плавающей запятой двойной точности заданному значению и возвращает исходное значение в качестве атомарной операции.

Exchange(Object, Object)

Задает объект заданному значению и возвращает ссылку на исходный объект в виде атомарной операции.

Exchange<T>(T, T)

Задает переменную указанного типа T заданному значению и возвращает исходное значение как атомарную операцию.

Exchange(UInt16, UInt16)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs

Внимание

Этот API несовместим с CLS.

Задает 16-разрядное целое число со знаком заданному значению и возвращает исходное значение в виде атомарной операции.

public:
 static System::UInt16 Exchange(System::UInt16 % location1, System::UInt16 value);
[System.CLSCompliant(false)]
public static ushort Exchange(ref ushort location1, ushort value);
[<System.CLSCompliant(false)>]
static member Exchange : uint16 * uint16 -> uint16
Public Shared Function Exchange (ByRef location1 As UShort, value As UShort) As UShort

Параметры

location1
UInt16

Переменная, заданная в указанное значение.

value
UInt16

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Атрибуты

Исключения

Адрес location1 — это указатель null.

Применяется к

Exchange(UInt32, UInt32)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs

Внимание

Этот API несовместим с CLS.

Задает 32-разрядное целое число без знака в указанное значение и возвращает исходное значение в виде атомарной операции.

public:
 static System::UInt32 Exchange(System::UInt32 % location1, System::UInt32 value);
[System.CLSCompliant(false)]
public static uint Exchange(ref uint location1, uint value);
[<System.CLSCompliant(false)>]
static member Exchange : uint32 * uint32 -> uint32
Public Shared Function Exchange (ByRef location1 As UInteger, value As UInteger) As UInteger

Параметры

location1
UInt32

Переменная, заданная в указанное значение.

value
UInt32

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Атрибуты

Исключения

Адрес location1 — это указатель null.

Применяется к

Exchange(Single, Single)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs

Задает число с плавающей запятой с одной точностью заданному значению и возвращает исходное значение в виде атомарной операции.

public:
 static float Exchange(float % location1, float value);
public static float Exchange(ref float location1, float value);
static member Exchange : single * single -> single
Public Shared Function Exchange (ByRef location1 As Single, value As Single) As Single

Параметры

location1
Single

Переменная, заданная в указанное значение.

value
Single

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Исключения

Адрес location1 — это указатель null.

См. также раздел

Применяется к

Exchange(UIntPtr, UIntPtr)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs

Внимание

Этот API несовместим с CLS.

Задает целое число без знака собственного размера в указанное значение и возвращает исходное значение в виде атомарной операции.

public:
 static UIntPtr Exchange(UIntPtr % location1, UIntPtr value);
[System.CLSCompliant(false)]
public static UIntPtr Exchange(ref UIntPtr location1, UIntPtr value);
[<System.CLSCompliant(false)>]
static member Exchange : unativeint * unativeint -> unativeint
Public Shared Function Exchange (ByRef location1 As UIntPtr, value As UIntPtr) As UIntPtr

Параметры

location1
UIntPtr

unativeint

Переменная, заданная в указанное значение.

value
UIntPtr

unativeint

Значение, для которого задан параметр location1.

Возвращаемое значение

UIntPtr

unativeint

Исходное значение location1.

Атрибуты

Исключения

Адрес location1 — это указатель null.

Применяется к

Exchange(UInt64, UInt64)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs

Внимание

Этот API несовместим с CLS.

Задает 64-разрядное целое число без знака в указанное значение и возвращает исходное значение в виде атомарной операции.

public:
 static System::UInt64 Exchange(System::UInt64 % location1, System::UInt64 value);
[System.CLSCompliant(false)]
public static ulong Exchange(ref ulong location1, ulong value);
[<System.CLSCompliant(false)>]
static member Exchange : uint64 * uint64 -> uint64
Public Shared Function Exchange (ByRef location1 As ULong, value As ULong) As ULong

Параметры

location1
UInt64

Переменная, заданная в указанное значение.

value
UInt64

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Атрибуты

Исключения

Адрес location1 — это указатель null.

Применяется к

Exchange(SByte, SByte)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs

Внимание

Этот API несовместим с CLS.

Задает 8-разрядное целое число со знаком заданному значению и возвращает исходное значение в виде атомарной операции.

public:
 static System::SByte Exchange(System::SByte % location1, System::SByte value);
[System.CLSCompliant(false)]
public static sbyte Exchange(ref sbyte location1, sbyte value);
[<System.CLSCompliant(false)>]
static member Exchange : sbyte * sbyte -> sbyte
Public Shared Function Exchange (ByRef location1 As SByte, value As SByte) As SByte

Параметры

location1
SByte

Переменная, заданная в указанное значение.

value
SByte

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Атрибуты

Исключения

Адрес location1 — это указатель null.

Применяется к

Exchange(Byte, Byte)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs

Задает 8-разрядное целое число без знака в указанное значение и возвращает исходное значение в виде атомарной операции.

public:
 static System::Byte Exchange(System::Byte % location1, System::Byte value);
public static byte Exchange(ref byte location1, byte value);
static member Exchange : byte * byte -> byte
Public Shared Function Exchange (ByRef location1 As Byte, value As Byte) As Byte

Параметры

location1
Byte

Переменная, заданная в указанное значение.

value
Byte

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Исключения

Адрес location1 — это указатель null.

Применяется к

Exchange(IntPtr, IntPtr)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs

Задает целое число со знаком собственного размера в заданное значение и возвращает исходное значение в виде атомарной операции.

public:
 static IntPtr Exchange(IntPtr % location1, IntPtr value);
public static IntPtr Exchange(ref IntPtr location1, IntPtr value);
static member Exchange : nativeint * nativeint -> nativeint
Public Shared Function Exchange (ByRef location1 As IntPtr, value As IntPtr) As IntPtr

Параметры

location1
IntPtr

nativeint

Переменная, заданная в указанное значение.

value
IntPtr

nativeint

Значение, для которого задан параметр location1.

Возвращаемое значение

IntPtr

nativeint

Исходное значение location1.

Исключения

Адрес location1 — это указатель null.

См. также раздел

Применяется к

Exchange(Int64, Int64)

Исходный код:
Interlocked.CoreCLR.cs
Исходный код:
Interlocked.CoreCLR.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.CoreCLR.cs

Задает 64-разрядное целое число со знаком заданному значению и возвращает исходное значение в виде атомарной операции.

public:
 static long Exchange(long % location1, long value);
public static long Exchange(ref long location1, long value);
static member Exchange : int64 * int64 -> int64
Public Shared Function Exchange (ByRef location1 As Long, value As Long) As Long

Параметры

location1
Int64

Переменная, заданная в указанное значение.

value
Int64

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Исключения

Адрес location1 — это указатель null.

См. также раздел

Применяется к

Exchange(Int32, Int32)

Исходный код:
Interlocked.CoreCLR.cs
Исходный код:
Interlocked.CoreCLR.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.CoreCLR.cs

Задает 32-разрядное целое число со знаком заданному значению и возвращает исходное значение в виде атомарной операции.

public:
 static int Exchange(int % location1, int value);
public static int Exchange(ref int location1, int value);
static member Exchange : int * int -> int
Public Shared Function Exchange (ByRef location1 As Integer, value As Integer) As Integer

Параметры

location1
Int32

Переменная, заданная в указанное значение.

value
Int32

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Исключения

Адрес location1 — это указатель null.

Адрес location1 — это указатель null.

Примеры

В следующем примере кода показан механизм блокировки ресурсов, безопасный для потоков.

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;
            }
        }
    }
}
Imports System.Threading

Namespace InterlockedExchange_Example
    Class MyInterlockedExchangeExampleClass
        '0 for false, 1 for true.
        Private Shared usingResource As Integer = 0

        Private Const numThreadIterations As Integer = 5
        Private Const numThreads As Integer = 10

        <MTAThread> _
        Shared Sub Main()
            Dim myThread As Thread
            Dim rnd As New Random()

            Dim i As Integer
            For i = 0 To numThreads - 1
                myThread = New Thread(AddressOf 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()
            Next i
        End Sub

        Private Shared Sub MyThreadProc()
            Dim i As Integer
            For i = 0 To numThreadIterations - 1
                UseResource()

                'Wait 1 second before next attempt.
                Thread.Sleep(1000)
            Next i
        End Sub 

        'A simple method that denies reentrancy.
        Shared Function UseResource() As Boolean
            '0 indicates that the method is not in use.
            If 0 = Interlocked.Exchange(usingResource, 1) Then
                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(usingResource, 0)
                Return True
            Else
                Console.WriteLine("   {0} was denied the lock", Thread.CurrentThread.Name)
                Return False
            End If
        End Function 
    End Class 
End Namespace

См. также раздел

Применяется к

Exchange(Int16, Int16)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs

Задает 16-разрядное целое число без знака в указанное значение и возвращает исходное значение в виде атомарной операции.

public:
 static short Exchange(short % location1, short value);
public static short Exchange(ref short location1, short value);
static member Exchange : int16 * int16 -> int16
Public Shared Function Exchange (ByRef location1 As Short, value As Short) As Short

Параметры

location1
Int16

Переменная, заданная в указанное значение.

value
Int16

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Исключения

Адрес location1 — это указатель null.

Применяется к

Exchange(Double, Double)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs

Задает число с плавающей запятой двойной точности заданному значению и возвращает исходное значение в качестве атомарной операции.

public:
 static double Exchange(double % location1, double value);
public static double Exchange(ref double location1, double value);
static member Exchange : double * double -> double
Public Shared Function Exchange (ByRef location1 As Double, value As Double) As Double

Параметры

location1
Double

Переменная, заданная в указанное значение.

value
Double

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Исключения

Адрес location1 — это указатель null.

См. также раздел

Применяется к

Exchange(Object, Object)

Исходный код:
Interlocked.CoreCLR.cs
Исходный код:
Interlocked.CoreCLR.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.CoreCLR.cs

Задает объект заданному значению и возвращает ссылку на исходный объект в виде атомарной операции.

public:
 static System::Object ^ Exchange(System::Object ^ % location1, System::Object ^ value);
public static object Exchange(ref object location1, object value);
public static object? Exchange(ref object? location1, object? value);
static member Exchange : obj * obj -> obj
Public Shared Function Exchange (ByRef location1 As Object, value As Object) As Object

Параметры

location1
Object

Переменная, заданная в указанное значение.

value
Object

Значение, для которого задан параметр location1.

Возвращаемое значение

Исходное значение location1.

Исключения

Адрес location1 — это указатель null.

Адрес location1 — это указатель null.

Комментарии

Важный

Перегрузка метода Exchange<T>(T, T) предоставляет универсальный вариант, который можно использовать для конкретных ссылочных типов.

См. также раздел

Применяется к

Exchange<T>(T, T)

Исходный код:
Interlocked.cs
Исходный код:
Interlocked.cs
Исходный код:
Interlocked.CoreCLR.cs
Исходный код:
Interlocked.CoreCLR.cs
Исходный код:
Interlocked.CoreCLR.cs

Задает переменную указанного типа T заданному значению и возвращает исходное значение как атомарную операцию.

public:
generic <typename T>
 where T : class static T Exchange(T % location1, T value);
public:
generic <typename T>
 static T Exchange(T % location1, T value);
public static T Exchange<T>(ref T location1, T value) where T : class;
public static T Exchange<T>(ref T location1, T value);
[System.Runtime.InteropServices.ComVisible(false)]
public static T Exchange<T>(ref T location1, T value) where T : class;
static member Exchange : 'T * 'T -> 'T (requires 'T : null)
static member Exchange : 'T * 'T -> 'T
[<System.Runtime.InteropServices.ComVisible(false)>]
static member Exchange : 'T * 'T -> 'T (requires 'T : null)
Public Shared Function Exchange(Of T As Class) (ByRef location1 As T, value As T) As T
Public Shared Function Exchange(Of T) (ByRef location1 As T, value As T) As T

Параметры типа

T

Тип, используемый для location1 и value.

Параметры

location1
T

Переменная, заданная в указанное значение. Это эталонный параметр (ref в C#, ByRef в Visual Basic).

value
T

Значение, для которого задан параметр location1.

Возвращаемое значение

T

Исходное значение location1.

Атрибуты

Исключения

Адрес location1 — это указатель null.

Указан неподдерживаемый T. В .NET 8 и более ранних версиях T должен быть ссылочным типом. В .NET 9 и более поздних версиях T должен быть ссылкой, примитивом или типом перечисления.

Применяется к