wskaźnik do obiektu klasy w 2 wątkach

0

Witam
W 2 wątkach mam wskaźnbik na ten sam obiekt pewnej klasy.
Załóżmy że ta klasa ma metodę o nazwie metoda1(). W metoda1() jest deklaracja zmiennych lokalnych, nie ma użycia pól/zmiennych samej klasy. Jako że wątki operują na własnych staosach to mozna bez mutexa wywołac 2 metody w tym samym czasie. Co w przypadku gdy pola klasy są używane?

1

To co zwykle: race condition ;]

3

Co w przypadku gdy pola klasy są używane?

Wtedy musisz zadbać o odpowiednią synchronizację. Samodzielnie.

Jeśli co najmniej jeden z tych wątków dokonuje operacji zapisu, to:

  1. Użyj muteksów (sekcji krytycznych, czy jak w/g nomenklatury Twojego systemu się zwą). Np. std::mutex
  2. Użyj zmiennych atomowych (np. std::atomic)
  3. Zapewnij niemożliwość nadpisania poprzez zmianę logiki programu. To najbardziej ryzykowne rozwiązanie i nie stosowałbym go poza dość ekstremalnymi przypadkami. Nie mam na tę chwilę pomysłu na poprawny przykład użycia tego.
1

Jako że wątki operują na własnych staosach to mozna bez mutexa wywołac 2 metody w tym samym czasie.

Wywołać można, ale własny stos to niewystarczająca cecha aby takie wywołanie działało prawidłowo.

Właściwie tylko w jednej sytuacji można się obyć bez blokad thread-safe i będzie to bezpieczne: gdy oba wątki tylko odczytują wspólną zmienną, której wartość była ustawiona wcześniej.
Jeśli jeden wątek zapisuje zmienną, a drugi tylko odczytuje - teoretycznie też powinno działać, pod warunkiem że sam zapis jest atomowy. Ale to już stąpanie po bardzo cienkim lodzie.

0
Azarien napisał(a):

Wywołać można, ale własny stos to niewystarczająca cecha aby takie wywołanie działało prawidłowo.

Właściwie tylko w jednej sytuacji można się obyć bez blokad thread-safe i będzie to bezpieczne: gdy oba wątki tylko odczytują wspólną zmienną, której wartość była ustawiona wcześniej.

Masz na myśli zmienną/pole klasy oczywiście, bo co do zmiennych lokalnych to ze względu na oddzielny stos każdy wątek będzie mial ja pod innym adresem?

0

mam na myśli te zmienne i obiekty, które są wspólne dla obu wątków. jeśli w zmiennej lokalnej masz wskaźnik na obiekt globalny, to oddzielny stos cię nie uratuje, bo oba wątki będą przez osobne wskaźniki odwoływać się do tego samego obiektu.

0

Jeśli jeden wątek zapisuje zmienną, a drugi tylko odczytuje - teoretycznie też powinno działać, pod warunkiem że sam zapis jest atomowy. Ale to już stąpanie po bardzo cienkim lodzie.

Zastanawiam się, czy jest jakaś opcja, żeby pojedynczy zapis był nieatomowy. Oczywiście mówimy tu o akcji typu var = wartość, a nie o strcpy / memcpy lub podobnych.

Edit: usunięcie nawiasów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1