Stosowanie instrukcji lock

Stosowanie instrukcji lock
UA
  • Rejestracja:około 15 lat
  • Ostatnio:4 miesiące
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.

edytowany 1x, ostatnio: usm_auriga
JU
  • Rejestracja:około 22 lata
  • Ostatnio:około miesiąc
  • Postów:5042
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.
UA
  • Rejestracja:około 15 lat
  • Ostatnio:4 miesiące
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

edytowany 2x, ostatnio: usm_auriga
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.

katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
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 :)

vpiotr
Albo niech blokuje na czas odczytu parametrów - w momencie startu obliczeń.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
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.

edytowany 1x, ostatnio: vpiotr
JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 miesiące
  • Postów:1065
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.

edytowany 1x, ostatnio: jacek.placek
JU
  • Rejestracja:około 22 lata
  • Ostatnio:około miesiąc
  • Postów:5042
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.

GR
a to nie jest tak, że kiedy wątek zapisujący np. ma kilka instrukcji powiedzmy (a +=b, a+= c ) , i na rzecz wątku odczytującego przerwie działanie po a +=b to dane odczytane będą fałszywe ?
JU
Do tego właśnie jest Interlocked, które powoduje, że te operacje będą atomowe.
GR
właśnie rozwiązałeś mój problem , dlaczego aplikacja inaczej mi działała w debug a inaczej w release. Razem z interlocked przeczytalem o volatile ; ) Dzięki.
JU
Proszę bardzo :D
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.

UA
  • Rejestracja:około 15 lat
  • Ostatnio:4 miesiące
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

katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
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

JU
  • Rejestracja:około 22 lata
  • Ostatnio:około miesiąc
  • Postów:5042
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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)