W aplikacji C#, załóżmy, że mam jedną globalną klasę, która zawiera pewne elementy konfiguracji, tak jak poniżej:C bezpieczeństwo # wątek globalnych ustawień konfiguracyjnych
public class Options
{
int myConfigInt;
string myConfigString;
..etc.
}
static Options GlobalOptions;
członków tej klasy będą zastosowania w różnych wątków:
Thread1: GlobalOptions.myConfigString = blah;
podczas
Thread2: string thingie = GlobalOptions.myConfigString;
Używanie blokady dostępu do GlobalOptions obiekt byłby również niepotrzebny blokować, gdy 2 wątki mają dostęp do różnych elementów, ale z drugiej strony tworzenie obiektu synchronizacji dla każdego członka wydaje się również nieco przesadzone.
Ponadto użycie blokady w opcjach globalnych spowodowałoby, że mój kod byłby mniej ładny; jeśli muszę napisać
string stringiwanttouse;
lock(GlobalOptions)
{
stringiwanttouse = GlobalOptions.myConfigString;
}
wszędzie (i jest to bezpieczny wątku lub jest stringiwanttouse teraz tylko wskaźnik do myConfigString? Tak, jestem nowy w C# ....) zamiast
string stringiwanttouse = GlobalOptions.myConfigString;
powoduje, że kod wygląda okropnie.
Więc ... Jaki jest najlepszy (i najprostszy!) Sposób na zapewnienie bezpieczeństwa gwintów?
Myślę, że byłoby jeszcze wyraźniej, gdybyś mógł określić, jaki problem próbujesz rozwiązać. Nie ma nieodłącznego niebezpieczeństwa w dwóch wątkach ustawiających wartość globalną w tym samym czasie. Środowisko CLR nie ulegnie awarii. Jakiego rodzaju problem z synchronizacją próbujesz rozwiązać? – PeterAllenWebb
Co się dzieje, gdy jeden wątek zapisuje ciąg, a inny próbuje go odczytać? Czy zawsze otrzymam jeden lub drugi ciąg, czy może się zdarzyć, że otrzymam częściowo zastąpiony ciąg? – Led