🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #267794

Re: Ciemna strona C++

#267794
From: Marcin ‘Qrczak’ Kowalczyk
Date: Mon, 26 Nov 2007 11:26
77 lines
5622 bytes
Dnia 26-11-2007, Pn o godzinie 09:17 +0000, Sektor van Skijlen pisze:

> No dobrze - ale co taki sygnał może przerwać?

Stan blokowania sygnałów przez dany wątek ma postać pary (all, async),
gdzie all jest liczbą naturalną oznaczającą liczbę powodów, dla których
sygnały powinny być zablokowane, a async ma zakres 0..1. Ta przestrzeń
stanów daje to tylko trzy możliwe reakcje na sygnały:

(0, 0) - sygnał może być obsłużony w każdym momencie
(0, 1) - sygnał może być obsłużony tylko przez wybrane operacje,
         które na coś czekają (tzw. tryb synchroniczny)
inne   - sygnał jest kolejkowany do obsłużenia później

Stan blokowania jest jawnie zmieniany przez pewne funkcje, a także mniej
jawnie:

- Sygnały są blokowane na czas wzięcia muteksu, wzięcia read-write locka
  (jak on się po polsku nazywa?), obliczania wartości leniwej zmiennej,
  inicjalizacja modułu innego niż moduł główny, jawnego uruchomienia
  finalizatora obiektu, obsługi wyjątku (chyba że zaznaczono inaczej),
  obsługi sygnału.

- Konstrukcja zarządzająca zasobem wymagającym jawnego zwalniania
  (Using) składa się z trzech części: pobranie zasobu, treść główna
  i zwolnienie zasobu. Na czas pobierania zasobu asynchroniczne
  sygnały są blokowane, a na czas zwalniania - wszystkie są blokowane.

- Nowy wątek normalnie ma odblokowane sygnały, ale można utworzyć wątek
  z zablokowanymi na starcie (co jest konieczne, jeśli chcemy uniknąć
  okienka, kiedy wątek nie zdążył jeszcze określić innej funkcji obsługi
  sygnałów).

(Leniwa zmienna to jest coś takiego, co przy pierwszej próbie odczytania
wartości wykonuje dane obliczenie, a przy następnej próbie zwraca to co
obliczono poprzednio. Pytanie o wartość leniwej zmiennej, która właśnie
się liczy przez inny wątek, czeka na zakończenie tego obliczenia.
Pytanie o wartość leniwej zmiennej, która właśnie się liczy przez ten
sam wątek, jest błędem. Inicjalizacja modułu ma analogiczną semantykę
i wewnętrznie używa jednej leniwej zmiennej na moduł.)

Operacje, które obsługują sygnały w trybie synchronicznym, to
czekanie na condition, na zakończenie wątku, na zakończenie procesu,
na wejście-wyjście (w tym na otwarcie pliku, który może być rurką -
wtedy open jest blokujące), na upływ danego czasu. Ale nie na mutex,
na leniwą zmienną ani na finalizator obiektu.

Nie będę teraz wnikać w bardziej szczegółowe przypadki: leniwe listy
(które są podobne do leniwych zmiennych, ale mają dodatkowe komplikacje
związane z sygnałami), eksperymentalne kolejki multipleksujące zdarzenia,
czekanie na muteks przy wyjściu z lokalnego zwolnienia, a nie przy
wejściu na lokalne zajęcie, fork wielowątkowego procesu i inne.

> Oczywiście wątek nadrzędny powinien dostać killa w przypadku wykrycia
> zakleszczenia.

Jakiego zakleszczenia i jaki wątek nadrzędny? W Kogucie wątki nie mają
relacji nadrzędny-podrzędny.

Jeśli wątek miałby zakleszczyć się sam ze sobą, to odpowiednia operacja
rzuca wyjątkiem. Wzajemne zakleszczenie kilku wątków nie jest wykrywane,
ale są reakcje na to, że wątek miałby zostać odśmiecony (co może być
skutkiem ich zakleszczenia, jeśli nikt inny nie ma dostępu do obiektów
synchronizujących, na których czekają) i na zakleszczenie wszystkich
wątków.

> Tak - tu, jak najbardziej, ale napisałem wyraźnie: NIE odkładanie
> reakcji na przerwanie ad calendas graecas.

To jest kwestia przyzwoitości kodu, a nie gwarancji dawanych przez język.
Dobrym zwyczajem jest blokowanie sygnałów tylko na krótkie chwile, ale
nie da się tego wymusić.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID: <1196076390.30869.52.camel@qrnik>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgtb6j$nur$1@news.vectranet.pl> <fgv6ba$k14$1@bozon2.softax.pl> <fgvkne$u3b$1@news.vectranet.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi1bs4$nn3$1@bozon2.softax.pl> <fi27ds$gt1$1@kujawiak.man.lodz.pl> <1195688300.8426.30.camel@qrnik> <fi3ems$7ig$1@kujawiak.man.lodz.pl> <1195734091.8426.77.camel@qrnik> <fi6n5f$fpr$1@kujawiak.man.lodz.pl> <1195858230.20523.107.camel@qrnik> <fie2un$cbn$1@kujawiak.man.lodz.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Marcin ‘Qrczak’ Kowalczyk
 <qrczak@knm.org.pl>
Newsgroups: pl.comp.lang.c
Subject: Re: Ciemna strona C++
Date: Mon, 26 Nov 2007 12:26:30 +0100
Organization: tp.internet - http://www.tpi.pl/
Lines: 105
Message-ID: <1196076390.30869.52.camel@qrnik>
References: <fghgeo$spf$1@nemesis.news.tpi.pl>  <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl>  <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl>  <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl>  <fgtb6j$nur$1@news.vectranet.pl> <fgv6ba$k14$1@bozon2.softax.pl>  <fgvkne$u3b$1@news.vectranet.pl> <fh1tjd$dtt$1@bozon2.softax.pl>  <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl>  <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl>  <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl>  <fhv020$8k1$1@news.vectranet.pl> <fi1bs4$nn3$1@bozon2.softax.pl>  <fi27ds$gt1$1@kujawiak.man.lodz.pl> <1195688300.8426.30.camel@qrnik>  <fi3ems$7ig$1@kujawiak.man.lodz.pl> <1195734091.8426.77.camel@qrnik>  <fi6n5f$fpr$1@kujawiak.man.lodz.pl> <1195858230.20523.107.camel@qrnik>  <fie2un$cbn$1@kujawiak.man.lodz.pl>
NNTP-Posting-Host: hjd150.internetdsl.tpnet.pl
Mime-Version: 1.0
X-Trace: atlantis.news.tpi.pl 1196076454 15390 79.187.237.150 (26 Nov 2007 11:27:34 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Mon, 26 Nov 2007 11:27:34 +0000 (UTC)
In-Reply-To: <fie2un$cbn$1@kujawiak.man.lodz.pl>
X-Mailer: Evolution 2.12.1 PLD Linux
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit