Interlocked::Exchange Method (Int32%, Int32)
.NET Framework (current version)
Sets a 32-bit signed integer to a specified value and returns the original value, as an atomic operation.
Assembly: mscorlib (in mscorlib.dll)
Parameters
- location1
-
Type:
System::Int32%
The variable to set to the specified value.
- value
-
Type:
System::Int32
The value to which the location1 parameter is set.
| Exception | Condition |
|---|---|
| ArgumentNullException | The address of location1 is a null pointer. |
The following code example shows a thread-safe resource locking mechanism.
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(); } }
Universal Windows Platform
Available since 8
.NET Framework
Available since 1.1
Portable Class Library
Supported in: portable .NET platforms
Silverlight
Available since 2.0
Windows Phone Silverlight
Available since 7.0
Windows Phone
Available since 8.1
Available since 8
.NET Framework
Available since 1.1
Portable Class Library
Supported in: portable .NET platforms
Silverlight
Available since 2.0
Windows Phone Silverlight
Available since 7.0
Windows Phone
Available since 8.1
Show: