Interlocked.Exchange 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
以原子操作的形式将变量设置为指定的值。
重载
Exchange(UIntPtr, UIntPtr) |
以原子操作的形式,将平台特定的句柄或指针设置为指定的值并返回原始值。 |
Exchange(UInt64, UInt64) |
以原子操作的形式,将 64 位无符号整数设置为指定的值并返回原始值。 |
Exchange(UInt32, UInt32) |
以原子操作的形式,将 32 位无符号整数设置为指定的值并返回原始值。 |
Exchange(Single, Single) |
以原子操作的形式,将单精度浮点数设置为指定的值并返回原始值。 |
Exchange(Double, Double) |
以原子操作的形式,将双精度浮点数设置为指定的值并返回原始值。 |
Exchange(IntPtr, IntPtr) |
以原子操作的形式,将平台特定的句柄或指针设置为指定的值并返回原始值。 |
Exchange(Int64, Int64) |
以原子操作的形式,将 64 位有符号整数设置为指定的值并返回原始值。 |
Exchange(Int32, Int32) |
以原子操作的形式,将 32 位有符号整数设置为指定的值并返回原始值。 |
Exchange(Object, Object) |
以原子操作的形式,将对象设置为指定的值并返回对原始对象的引用。 |
Exchange<T>(T, T) |
以原子操作的形式,将指定类型 |
Exchange(UIntPtr, UIntPtr)
重要
此 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)
重要
此 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(UInt32, UInt32)
重要
此 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)
以原子操作的形式,将单精度浮点数设置为指定的值并返回原始值。
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(Double, Double)
以原子操作的形式,将双精度浮点数设置为指定的值并返回原始值。
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(IntPtr, IntPtr)
以原子操作的形式,将平台特定的句柄或指针设置为指定的值并返回原始值。
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)
以原子操作的形式,将 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)
以原子操作的形式,将 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 namespace System;
using namespace System::Threading;
const int numThreads = 10;
const int numThreadIterations = 5;
ref class MyInterlockedExchangeExampleClass
{
public:
static void MyThreadProc()
{
for ( int i = 0; i < numThreadIterations; i++ )
{
UseResource();
//Wait 1 second before next attempt.
Thread::Sleep( 1000 );
}
}
private:
//A simple method that denies reentrancy.
static bool UseResource()
{
//0 indicates that the method is not in use.
if ( 0 == Interlocked::Exchange( 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( usingResource, 0 );
return true;
}
else
{
Console::WriteLine( " {0} was denied the lock", Thread::CurrentThread->Name );
return false;
}
}
//0 for false, 1 for true.
static int usingResource;
};
int main()
{
Thread^ myThread;
Random^ rnd = gcnew Random;
for ( int i = 0; i < numThreads; i++ )
{
myThread = gcnew Thread( gcnew ThreadStart( MyInterlockedExchangeExampleClass::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();
}
}
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(Object, Object)
以原子操作的形式,将对象设置为指定的值并返回对原始对象的引用。
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
指针。
注解
重要
从 .NET Framework 2.0 开始,Exchange<T>(T, T) 方法重载为引用类型提供类型安全的替代项。 建议调用它而不是此重载。
另请参阅
适用于
Exchange<T>(T, T)
以原子操作的形式,将指定类型 T
的变量设置为指定的值并返回原始值。
public:
generic <typename T>
where T : class static T Exchange(T % location1, T value);
public static T Exchange<T> (ref T location1, T value) where T : class;
[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)
[<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
类型参数
- T
要用于 location1
和 value
的类型。 此类型必须是引用类型。
参数
- location1
- T
要设置为指定值的变量。 这是一个引用参数(C# 中为 ref
,Visual Basic 中为 ByRef
)。
- value
- T
location1
参数要设置成的值。
返回
- T
location1
的原始值。
- 属性
例外
location1
的地址是一个 null
指针。
注解
此方法仅支持引用类型。 有方法的Exchange重载,DoubleInt32Int64IntPtrSingle但不支持其他值类型。
备注
此方法重载优于 Exchange(Object, Object) 方法重载,因为后者需要对目标对象进行后期绑定访问。