• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Gdzie tworzyć sekcje krytyczne dostępu do danych współdzielonych: wewnątrz procedur czy na zewnątrz?

Aruba Cloud - Virtual Private Server VPS
+2 głosów
127 wizyt
pytanie zadane 25 maja 2024 w Algorytmy przez overcq Pasjonat (22,440 p.)
edycja 26 maja 2024 przez overcq

W utworzonym przeze mnie systemie tworzenia oprogramowania OUX/C+ wykorzystuję ‹zadania› asynchroniczne, które są wątkami systemowymi mającymi dodatkowe funkcjonalności. W przykładowym wątku rysowania korzystam z danych globalnych procesu, w którym wątek jest uruchomiony, w następujący sposób w pętli:

  1. Oczekiwanie na ‹raport›, po otrzymaniu którego…
  2. Czytanie danych globalnych procesu i obliczenia bez ich modyfikacji.
  3. Jednorazowa zamiana zmiennej globalnej procesu.

Stąd konieczne jest synchronizowanie na dostępie do danych pomiędzy takim wątkiem a pozostałymi wątkami w procesie.

Obecnie synchronizuję przez utworzenie sekcji krytycznej (z użyciem ‘muteksu’): w takim wątku – wokół punktu 2 i 3, a w innych wątkach wokół bloków modyfikacji danych globalnych procesu.

W tym przykładzie współdzielone dane globalne procesu są wyszczególnione: są to trzy zmienne (w skrócie – “displays”, “windows” i “objects” graficzne w oknie) będące wskaźnikami do struktur zarządzanych przez ‹menedżerów› (rodzaj obiektowości w C+). Dlatego można wskazać, w których procedurach ‹menedżera› następuje modyfikacja: w procedurach dodawania ‘display’, ‘window’ i ‘object’ oraz w procedurach usuwania. Nie trzeba się przejmować modyfikacją zawartości obiektu, ponieważ zawsze zachowuje on wewnętrzną integralność danych w modelu podzielonej na ‹zadania› odpowiedzialności ich ustawiania‐czytania.

Pytanie jest następujące: gdzie umieszczać sekcje krytyczne w innych wątkach? Czy wewnątrz procedur modyfikacji zmiennych globalnych czy na zewnątrz, wokół bloków wołających te procedury w procedurze np. “main”?

I czy w ogóle to jest odpowiednie podejście do synchronizacji wątków mających dostęp do wyszczególnionych danych globalnych procesu?

Wydaje się, że lepiej jest umieszczać sekcje krytyczne wokół bloków wołających procedury (na zewnątrz) w procedurze “main” i procedurach ‹zadań›, ponieważ:

  • Blokowanie wewnątrz, we fragmencie procedury takiej jak dodającej ‘display’ lub ‘window’ dawałoby teoretycznie (ponieważ i tak wątek czeka na ‹raport›) możliwość bezużytecznego wykonania się wątku rysującego, gdyż ‹zadania› zmieniające stan ‘objects’ nie są w tym momencie wykonywane.
  • Tuż po dodaniu ‘display’ lub ‘window’ — ‘objects’ jeszcze nie są utworzone.
  • Dodawanie ‘objects’ i tak wymaga blokowania na zewnątrz ze względu na specyfikację wywołań, a przerysowywanie niekompletnego zestawu ‘objects’ byłoby mylące dla użytkownika.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 163 wizyt
pytanie zadane 12 grudnia 2024 w Algorytmy przez MARECKIdev Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 901 wizyt
0 głosów
1 odpowiedź 131 wizyt
pytanie zadane 2 września 2022 w C i C++ przez RufinB Bywalec (2,020 p.)

93,326 zapytań

142,323 odpowiedzi

322,391 komentarzy

62,655 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...