Stosowanie instrukcji lock

0

Witam, mam programik który cyklicznie sprawdza stan ustawień i wykonuje pomiary, trwają one około 26 sekund. W programie dodana jest funkcjonalność w której są użytkownicy i mają swoje ustawienia. Zastanawia mnie sytuacja gdy użytkownik będzie zmieniał dane ustawień a aplikacja spróbuje je odczytać w tym samym momencie. Czy aplikacja nie zawiesi się ? Czy istnieje w takich przypadkach potrzeba stosowania instrukcji lock ? Dodam, że aplikacja napisana jest w WinForms i wątek poboczny sprawdza ustawienia i dokonuje pomiary.

2

Lock służy do synchronizacji wątków. Jeśli pomiary są długie i korzystają z ustawień użytkownika, to w takim przypadku mogą być błędne:

  1. Rozpoczęcie pomiarów
  2. Pobranie ustawienia "Ala ma kota"
  3. Liczenie na podstawie tego ustawienia
  4. Użytkownik zmienia "Ala ma kota"
  5. Pobranie ustawienia "Ala ma kota"
  6. Liczenie na podstawie tego ustawienia

Dostaniesz... nie wiadomo co. W momencie obliczeń możesz zrobić dwie rzeczy. Zależy na czym Ci bardziej zależy:

  1. Zabronić użytkownikowi zmieniać ustawienia
  2. Zrobić coś w stylu snapshotu tych ustawień. Tzn. tuż przed rozpoczęciem obliczeń kopiujesz sobie ustawienia użytkownika i one są uważane za aktualne. Obliczenia są robione na podstawie kopii ustawień użytkownika.
0

Dzięki za poradę, ale zastanawia mnie to ponieważ jest jeden wątek poboczny wykonujący pomiary, a wątek obsługujący gui użytkownika wpisuje wartości ustawien. Dlatego pytałem bo mnie to wyglądało na synchronizację wątków w trakcie pracy. Widocznie byłem w błędzie

0

Synchronizacja jest ci potrzebna jeżeli dwa wątki mogą zapisywać do jednej zmiennej w tym samym czasie. U ciebie z tego co piszesz ten problem nie występuje, bo w najgorszym wypadku jeden wątek zapisuje zmienną, a drugi jedynie ją odczytuje.

0
Mały napisał(a):

Synchronizacja jest ci potrzebna jeżeli dwa wątki mogą zapisywać do jednej zmiennej w tym samym czasie. U ciebie z tego co piszesz ten problem nie występuje, bo w najgorszym wypadku jeden wątek zapisuje zmienną, a drugi jedynie ją odczytuje.

bzdura, oczywiscie ze w takiej sytuacji synchronizacja jest potrzebna. zreszta powodzenia w przekazywaniu danych miedzy watkiem UI a innymi watkami bez synchronizacji :)

do autora tematu - ciezko wywnioskowac co jest potrzebne w twoim kodzie bez zobaczenia go. dodatkowo - jakie sa wymagania wzgledem aplikacji? jesli nie masz wymagan to po prostu niech watek na starcie obliczen blokuje edycje gui i problem z glowy :)

2
Mały napisał(a):

Synchronizacja jest ci potrzebna jeżeli dwa wątki mogą zapisywać do jednej zmiennej w tym samym czasie. U ciebie z tego co piszesz ten problem nie występuje, bo w najgorszym wypadku jeden wątek zapisuje zmienną, a drugi jedynie ją odczytuje.

To wnioskowanie sprawdziłoby się na hipotetycznym 8-bitowym procesorze z jednym rdzeniem lub bez cache ale za to z wątkami.

0

Jak juz @katelx napisal synchro jest potrzebne. Pomysl @Juhas ze snapshotem to obiekt danych, ktory jest mutable (?). Kwestia czy user MUSI czekac na zakonczenie oboiczen czy moze uruchomic nowe w trakcie przetwarzania starszych danych.
Jak cos odpalasz w innym wątku to zawsze trzeba synchronizowac z gui.

1
jacek.placek napisał(a):

Jak juz @katelx napisal synchro jest potrzebne.

Uściślijmy. Jeśli jeden wątek zapisuje dane, a drugi je odczytuje, to synchronizacja NIE JEST potrzebna. Jeśli dwa wątki zapisują tą samą zmienną, to synchronizacja jest KONIECZNA.

Jeśli wątek poboczny wykonuje jakieś operacje na GUI, to synchronizacja też jest potrzebna.

0
katelx napisał(a):
Mały napisał(a):

Synchronizacja jest ci potrzebna jeżeli dwa wątki mogą zapisywać do jednej zmiennej w tym samym czasie. U ciebie z tego co piszesz ten problem nie występuje, bo w najgorszym wypadku jeden wątek zapisuje zmienną, a drugi jedynie ją odczytuje.

bzdura, oczywiscie ze w takiej sytuacji synchronizacja jest potrzebna. zreszta powodzenia w przekazywaniu danych miedzy watkiem UI a innymi watkami bez synchronizacji :)

Proszę o wyjaśnienie dlaczego w opisanej sytuacji, gdzie zmienna jest zapisywana tylko przez jeden wątek a odczytywana przez inny synchronizacja jest potrzebna.

0

Ostatecznie zrobię to chyba tak, że wykonam kopie ustawień tuż przed pomiarami i z nich będę pobierał wartości. Dzięki za porady

0
Juhas napisał(a):

Uściślijmy. Jeśli jeden wątek zapisuje dane, a drugi je odczytuje, to synchronizacja NIE JEST potrzebna. Jeśli dwa wątki zapisują tą samą zmienną, to synchronizacja jest KONIECZNA.

uscislijmy inna rzecz - pisanie caps lockiem nie sprawia ze cos jest bardziej prawdziwe ;)

Wesoły Terrorysta napisał(a):

Proszę o wyjaśnienie dlaczego w opisanej sytuacji, gdzie zmienna jest zapisywana tylko przez jeden wątek a odczytywana przez inny synchronizacja jest potrzebna.

clr nie zawsze gwarantuje ze wartosc ustawiona przez jeden watek bedzie widoczna (albo poprawna) dla innego. po to wlasnie sa locki i volatile/Interlocked

0
katelx napisał(a):
Juhas napisał(a):

Uściślijmy. Jeśli jeden wątek zapisuje dane, a drugi je odczytuje, to synchronizacja NIE JEST potrzebna. Jeśli dwa wątki zapisują tą samą zmienną, to synchronizacja jest KONIECZNA.

uscislijmy inna rzecz - pisanie caps lockiem nie sprawia ze cos jest bardziej prawdziwe ;)

Równie dobrze mogłem to po prostu wytłuścić, ale prościej mi było wcisnąć capsa ;)

Wesoły Terrorysta napisał(a):

Proszę o wyjaśnienie dlaczego w opisanej sytuacji, gdzie zmienna jest zapisywana tylko przez jeden wątek a odczytywana przez inny synchronizacja jest potrzebna.

clr nie zawsze gwarantuje ze wartosc ustawiona przez jeden watek bedzie widoczna (albo poprawna) dla innego. po to wlasnie sa locki i volatile/Interlocked

Ale to nie ma nic wspólnego z synchronizacją. Locki odpowiadają za synchronizację dwóch wątków. Volatile odpowiada za brak optymalizacji na zmiennej - to o oczym piszesz w ostatnim zdaniu. Ale volatile nie ma nic wspólnego z synchronizacją. Poza tym jest wymagane w specyficznych zastosowaniach. Interlocked natomiast powoduje, że operacje są atomowe.

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