Interlocked Sınıf

Tanım

Birden çok iş parçacığı tarafından paylaşılan değişkenler için atomik işlemler sağlar.

public ref class Interlocked abstract sealed
public ref class Interlocked sealed
public static class Interlocked
public sealed class Interlocked
type Interlocked = class
Public Class Interlocked
Public NotInheritable Class Interlocked
Devralma
Interlocked

Örnekler

Aşağıdaki kod örneğinde iş parçacığı güvenli bir kaynak kilitleme mekanizması gösterilmektedir.

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

Açıklamalar

Bu sınıfın yöntemleri, bir iş parçacığı diğer iş parçacıkları tarafından erişilebilen bir değişkeni güncelleştirirken veya iki iş parçacığı ayrı işlemcilerde eşzamanlı olarak yürütülürken zamanlayıcı bağlamları değiştirdiğinde oluşabilecek hatalara karşı korumaya yardımcı olur. Bu sınıfın üyeleri özel durumlar oluşturmaz.

Increment ve Decrement yöntemleri bir değişkeni artırır veya azaldırıp sonuçta elde edilen değeri tek bir işlemde depolar. Çoğu bilgisayarda, bir değişkeni artırmak atomik bir işlem değildir ve aşağıdaki adımları gerektirir:

  1. Bir örnek değişkeninden bir yazmaç içine bir değer yükleyin.

  2. Değeri artırma veya azaltma.

  3. Değerini örnek değişkeninde depolayın.

Increment ve Decrementkullanmıyorsanız, ilk iki adım yürütüldükten sonra bir iş parçacığı önlenebilir. Daha sonra başka bir iş parçacığı üç adımı da yürütebilir. İlk iş parçacığı yürütmeye devam ettiğinde, örnek değişkenindeki değerin üzerine yazar ve ikinci iş parçacığı tarafından gerçekleştirilen artış veya azaltmanın etkisi kaybolur.

Add yöntemi, bir tamsayı değişkenine atomik olarak bir tamsayı değeri ekler ve değişkenin yeni değerini döndürür.

Exchange yöntemi, belirtilen değişkenlerin değerlerini atomik olarak değiştirir. CompareExchange yöntemi iki işlemi birleştirir: iki değeri karşılaştırma ve karşılaştırmanın sonucuna bağlı olarak değişkenlerden birinde üçüncü bir değeri depolama. Karşılaştırma ve değişim işlemleri atomik bir işlem olarak gerçekleştirilir.

Paylaşılan değişkene herhangi bir yazma veya okuma erişiminin atomik olduğundan emin olun. Aksi takdirde veriler bozulmuş veya yüklenen değer yanlış olabilir.

Yöntemler

Add(Int32, Int32)

İki 32 bit tamsayı ekler ve ilk tamsayıyı atomik işlem olarak toplam ile değiştirir.

Add(Int64, Int64)

İki 64 bit tamsayı ekler ve ilk tamsayıyı atomik işlem olarak toplam ile değiştirir.

Add(UInt32, UInt32)

İki adet 32 bit işaretsiz tamsayı ekler ve ilk tamsayıyı atomik işlem olarak toplam ile değiştirir.

Add(UInt64, UInt64)

İki adet 64 bit işaretsiz tamsayı ekler ve ilk tamsayıyı atomik işlem olarak toplam ile değiştirir.

And(Int32, Int32)

Bit düzeyinde "ands" iki 32 bit işaretli tamsayıdır ve ilk tamsayıyı atomik bir işlem olarak sonuçla değiştirir.

And(Int64, Int64)

Bit düzeyinde "ands" iki 64 bit işaretli tamsayıdır ve ilk tamsayıyı atomik bir işlem olarak sonuçla değiştirir.

And(UInt32, UInt32)

Bit düzeyinde "ands" iki 32 bit işaretsiz tamsayıdır ve ilk tamsayıyı atomik bir işlem olarak sonuçla değiştirir.

And(UInt64, UInt64)

Bit düzeyinde "ands" iki 64 bit işaretsiz tamsayıdır ve ilk tamsayıyı atomik bir işlem olarak sonuçla değiştirir.

CompareExchange(Byte, Byte, Byte)

eşitlik için iki 8 bit işaretsiz tamsayıyı karşılaştırır ve eşitse ilk değeri atomik işlem olarak değiştirir.

CompareExchange(Double, Double, Double)

Eşitlik için iki çift duyarlıklı kayan nokta sayısını karşılaştırır ve eşitse ilk değeri atomik işlem olarak değiştirir.

CompareExchange(Int16, Int16, Int16)

eşitlik için iki 16 bit işaretsiz tamsayıyı karşılaştırır ve eşitse, atomik bir işlem olarak ilk değerin yerini alır.

CompareExchange(Int32, Int32, Int32)

Eşitlik için iki 32 bit işaretli tamsayıyı karşılaştırır ve eşitse, atomik işlem olarak ilk değerin yerini alır.

CompareExchange(Int64, Int64, Int64)

Eşitlik için iki 64 bit işaretli tamsayıyı karşılaştırır ve eşitse, atomik işlem olarak ilk değerin yerini alır.

CompareExchange(IntPtr, IntPtr, IntPtr)

Eşitlik için platforma özgü iki tanıtıcıyı veya işaretçiyi karşılaştırır ve eşitse, atomik işlem olarak ilkinin yerini alır.

CompareExchange(Object, Object, Object)

İki nesneyi başvuru eşitliği için karşılaştırır ve eşitse, atomik işlem olarak ilk nesnenin yerini alır.

CompareExchange(SByte, SByte, SByte)

Eşitlik için iki 8 bit işaretli tamsayıyı karşılaştırır ve eşitse, atomik işlem olarak ilk değerin yerini alır.

CompareExchange(Single, Single, Single)

Eşitlik için iki tek duyarlıklı kayan nokta sayısını karşılaştırır ve eşitse ilk değeri atomik işlem olarak değiştirir.

CompareExchange(UInt16, UInt16, UInt16)

Eşitlik için iki 16 bit işaretli tamsayıyı karşılaştırır ve eşitse, atomik işlem olarak ilk değerin yerini alır.

CompareExchange(UInt32, UInt32, UInt32)

eşitlik için iki 32 bit işaretsiz tamsayıyı karşılaştırır ve eşitse, atomik bir işlem olarak ilk değerin yerini alır.

CompareExchange(UInt64, UInt64, UInt64)

eşitlik için iki 64 bit işaretsiz tamsayıyı karşılaştırır ve eşitse, atomik işlem olarak ilk değerin yerini alır.

CompareExchange(UIntPtr, UIntPtr, UIntPtr)

Eşitlik için platforma özgü iki tanıtıcıyı veya işaretçiyi karşılaştırır ve eşitse, atomik işlem olarak ilkinin yerini alır.

CompareExchange<T>(T, T, T)

Belirtilen başvuru türünün iki örneğini, başvuru eşitliği için T karşılaştırır ve eşitse, atomik bir işlem olarak ilkinin yerini alır.

Decrement(Int32)

Belirtilen bir değişkeni azaltma ve sonucu atomik işlem olarak depolama.

Decrement(Int64)

Belirtilen değişkeni azaltma ve sonucu atomik işlem olarak depolama.

Decrement(UInt32)

Belirtilen bir değişkeni azaltma ve sonucu atomik işlem olarak depolama.

Decrement(UInt64)

Belirtilen bir değişkeni azaltma ve sonucu atomik işlem olarak depolama.

Exchange(Byte, Byte)

8 bit işaretsiz tamsayıyı belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange(Double, Double)

Çift duyarlıklı kayan nokta sayısını belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange(Int16, Int16)

16 bit işaretsiz tamsayıyı belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange(Int32, Int32)

32 bit imzalı bir tamsayıyı belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange(Int64, Int64)

64 bit imzalı tamsayıyı belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange(IntPtr, IntPtr)

Platforma özgü tanıtıcıyı veya işaretçiyi belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange(Object, Object)

Bir nesneyi belirtilen bir değere ayarlar ve atomik işlem olarak özgün nesneye başvuru döndürür.

Exchange(SByte, SByte)

8 bit imzalı bir tamsayıyı belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange(Single, Single)

Tek duyarlıklı kayan nokta sayısını belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange(UInt16, UInt16)

16 bit imzalı tamsayıyı belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange(UInt32, UInt32)

32 bit işaretsiz tamsayıyı belirtilen bir değere ayarlar ve atomik işlem olarak özgün değeri döndürür.

Exchange(UInt64, UInt64)

64 bit işaretsiz tamsayıyı belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange(UIntPtr, UIntPtr)

Platforma özgü tanıtıcıyı veya işaretçiyi belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Exchange<T>(T, T)

Belirtilen türdeki bir değişkeni T belirtilen bir değere ayarlar ve özgün değeri atomik işlem olarak döndürür.

Increment(Int32)

Belirtilen değişkeni artırır ve sonucu atomik işlem olarak depolar.

Increment(Int64)

Belirtilen değişkeni artırır ve sonucu atomik işlem olarak depolar.

Increment(UInt32)

Belirtilen değişkeni artırır ve sonucu atomik işlem olarak depolar.

Increment(UInt64)

Belirtilen değişkeni artırır ve sonucu atomik işlem olarak depolar.

MemoryBarrier()

Bellek erişimini şu şekilde eşitler: Geçerli iş parçacığını yürüten işlemci, MemoryBarrier()çağrısını izleyen bellek erişiminden sonra MemoryBarrier() yürütme çağrısından önce bellek erişecek şekilde yönergeleri yeniden sıralayamaz.

MemoryBarrierProcessWide()

Herhangi bir CPU'dan okuma ve yazma işlemlerinin engelden geçememesini sağlayan işlem genelinde bir bellek engeli sağlar.

Or(Int32, Int32)

Bit düzeyinde "ors" iki adet 32 bit işaretli tamsayıdır ve ilk tamsayıyı atomik bir işlem olarak sonuçla değiştirir.

Or(Int64, Int64)

Bit düzeyinde "ors" iki adet 64 bit işaretli tamsayıdır ve ilk tamsayıyı atomik bir işlem olarak sonuçla değiştirir.

Or(UInt32, UInt32)

Bit düzeyinde iki 32 bit işaretsiz tamsayı "ors" ve ilk tamsayıyı atomik bir işlem olarak sonuçla değiştirir.

Or(UInt64, UInt64)

Bit düzeyinde "ors" iki 64 bit işaretsiz tamsayıdır ve ilk tamsayıyı atomik bir işlem olarak sonuçla değiştirir.

Read(Int64)

Atomik işlem olarak yüklenen 64 bitlik bir değer döndürür.

Read(UInt64)

Atomik işlem olarak yüklenen 64 bit imzasız bir değer döndürür.

SpeculationBarrier()

Bekleyen okuma ve yazma işlemleri tamamlanana kadar bu noktadan sonra kurgusal yürütmeyi engelleyen bir bellek çiti tanımlar.

Şunlara uygulanır

İş Parçacığı Güvenliği

Bu tür iş parçacığı güvenlidir.

Ayrıca bkz.