Udostępnij za pośrednictwem


Składniki obsługujące wielowątkowość

Współużytkowanie zasobów między wątków jest częste konieczność w programowania wielowątkowego.Wiele wątków może być konieczne na przykład dostęp do udostępnionej bazy danych lub dokonać aktualizacji zestaw zmiennych systemowych.Kiedy więcej niż jeden wątek jednocześnie konkuruje dostępu do zasobów udostępnionych, możliwość wyścigu występuje.Sytuacja wyścigu istnieje, gdy wątek modyfikuje zasobów nieprawidłowy stan i następnie inny wątek próbuje uzyskać dostęp do tego zasobu i użyć go w nieprawidłowym stanie.Rozważmy następujący przykład:

Public Class WidgetManipulator
Public TotalWidgets as Integer = 0
Public Sub AddWidget()
   TotalWidgets += 1
   Console.WriteLine("Total widgets = " & TotalWidgets.ToString)
End Sub
Public Sub RemoveWidgets()
   TotalWidgets -= 10
End Sub
End Class
public class WidgetManipulator
{
   public int TotalWidgets = 0;
   public void AddWidget()
   {
      TotalWidgets++;
      Console.WriteLine("Total widgets = " + TotalWidgets.ToString());
   }
   public void RemoveWidgets()
   {
      TotalWidgets -= 10;
   }
}

Ta klasa udostępnia dwie metody.Metoda AddWidget, dodaje 1 do TotalWidgets pola i zapisuje wartość do konsoli.Druga metoda odejmuje 10 od wartości TotalWidgets.Należy rozważyć, co mogłoby się stać Jeśli dwa wątki równocześnie próbował uzyskać dostęp do wystąpienia tej samej WidgetManipulator klasy.Jeden wątek może wywołać AddWidget jednocześnie drugi wątek o nazwie RemoveWidgets.W takim przypadku wartość TotalWidgets przed dokładne wartości mogą być raportowane przez pierwszy wątek może być zmieniony przez drugiego wątku.Sytuacja wyścigu może spowodować niedokładne wyniki należy podać i może spowodować uszkodzenie danych.

Zapobieganie wyścigu za pomocą blokad

Sekcje krytyczne kodu można chronić przed wyścigu, wykorzystując blokad.Lock, reprezentowane przez słowo kluczowe języka Visual Basic Instrukcji SyncLock, lub słowa kluczowego C# lock instrukcji, umożliwia wykonanie uzyskanie praw wyłącznych wykonanie obiektu pojedynczego wątku.Poniższy przykład ilustruje blokad:

SyncLock MyObject
' Insert code that affects MyObject.
End SyncLock
lock(MyObject)
{
   // Insert code that affects MyObject.
}

Kiedy napotkał blokady, wykonanie na określony obiekt (MyObject w poprzednim przykładzie) jest blokowany aż wątek może uzyskać wyłącznego dostępu do obiektu.Gdy osiągnięty zostanie koniec blokady, blokada jest zwalniana i wykonanie działa normalnie.Tylko można uzyskać blokady obiektu, która zwraca odwołanie.Typ wartości nie mogą być zablokowane w ten sposób.

Wady blokad

Chociaż za pomocą blokad gwarantuje, że wiele wątków nie jednocześnie dostęp do obiektu, może być przyczyną znacznego zmniejszenia wydajności.Wyobraźmy sobie programu z wielu różnych wątki uruchomione.Jeśli każdy wątek musi korzystać z określonego obiektu i ma czekać na uzyskanie blokadę wyłączności na ten obiekt przed wykonaniem, wątki będą wszystkie zaprzestania wykonywania i kopii zapasowej za jednym innym przyczyną niskiej wydajności.Z tych powodów należy używać tylko blokad, gdy kod, który musi być wykonywane jako jednostka.Na przykład może aktualizować wiele zasobów, które były współzależne.Taki kod jest nazywany atomic.Ograniczanie blokad użytkownika tylko do kodu, który musi być wykonane w sposób atomowy umożliwi wielowątkowe składniki zapewniających bezpieczeństwo danych, zachowując dobrą wydajność zapisu.

Również należy zachować ostrożność uniknąć sytuacji, gdy zakleszczeń może wystąpić.W przypadku wielu wątków oczekiwania dla siebie zwolnić zasoby udostępnione.Na przykład wątek 1 może być przytrzymaj blokada zasobu a i oczekuje na zasób B.Wątek 2, z drugiej strony może mieć blokadę zasobu b i oczekuje zasobu A.W takim przypadku żaden wątek będzie mógł kontynuować.Jedynym sposobem uniknięcia zakleszczeń jest poprzez staranne programowania.

Zobacz też

Zadania

Porady: koordynowanie wielu wątków wykonania

Porady: manipulowanie kontrolkami pochodzącymi z wątków

Wskazówki: tworzenie prostego składnika wielowątkowego za pomocą języka Visual Basic

Wskazówki: tworzenie prostego składnika wielowątkowego za pomocą języka C#

Informacje

BackgroundWorker

Koncepcje

Asynchroniczny wzorzec oparty na zdarzeniach — przegląd

Inne zasoby

Wielowątkowość w składnikach