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ştirirken oluşabilecek hatalara karşı korunmaya yardımcı olur. Bu sınıfın üyeleri özel durum oluşturmaz.

Increment ve Decrement yöntemleri bir değişkeni artırır veya azaltır ve 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.

ve DecrementkullanmazsanızIncrement, 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ütmeyi sürdürürken, ö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 atomik olarak bir tamsayı değişkenine bir tamsayı değeri ekler ve değişkenin yeni değerini döndürür.

yöntemi, Exchange 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 bir değişkene 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 64 bit işaretsiz tamsayı ekler ve ilk tamsayıyı atomik işlem olarak toplamla 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 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 işlem olarak sonuçla 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ğerin yerini alır.

CompareExchange(Int32, Int32, Int32)

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

CompareExchange(Int64, Int64, Int64)

Eşitlik için iki 64 bit imzalı tamsayıyı karşılaştırır ve eşitse, 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 ilkinin yerini alır.

CompareExchange(Object, Object, Object)

Başvuru eşitliği için iki nesneyi karşılaştırır ve eşitse ilk nesnenin 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ğ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, 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, 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 ilkinin yerini alır.

CompareExchange<T>(T, T, T)

Belirtilen başvuru türünün T iki örneğini başvuru eşitliği için karşılaştırır ve eşitse 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(Double, Double)

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

Exchange(Int32, Int32)

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

Exchange(Int64, Int64)

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

Exchange(IntPtr, IntPtr)

Platforma özgü tanıtıcıyı veya işaretçiyi belirtilen bir değere ayarlar ve atomik işlem olarak özgün değeri 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(Single, Single)

Tek duyarlıklı kayan nokta sayısını belirtilen bir değere ayarlar ve atomik işlem olarak özgün değeri 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 atomik işlem olarak özgün değeri döndürür.

Exchange(UIntPtr, UIntPtr)

Platforma özgü bir 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ürde T bir değişkeni belirtilen değere ayarlar ve özgün değeri atomik bir 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, çağrısından sonra gelen bellek erişiminden sonra yürütülecek MemoryBarrier() çağrıdan önce bellek erişecek MemoryBarrier()ş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 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 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 "ors" iki 32 bit işaretsiz tamsayıdır 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 güvenli iş parçacığı türüdür.

Ayrıca bkz.