eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingpytanie z mutexówRe: pytanie z mutexów
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask
    .pl!news.nask.org.pl!news.internetia.pl!not-for-mail
    From: Michoo <m...@v...pl>
    Newsgroups: pl.comp.programming
    Subject: Re: pytanie z mutexów
    Date: Tue, 02 Jul 2013 18:16:18 +0200
    Organization: Netia S.A.
    Lines: 77
    Message-ID: <kquuvu$c01$1@mx1.internetia.pl>
    References: <5...@g...com>
    <51c56394$0$28103$c3e8da3$91613603@news.astraweb.com>
    <f...@4...com>
    <kq70gf$ngh$1@mx1.internetia.pl>
    <3...@4...com>
    <kq7g4r$a05$1@mx1.internetia.pl>
    <f...@4...com>
    <kqi854$v85$1@mx1.internetia.pl>
    <u...@4...com>
    <kqk43i$sfo$1@mx1.internetia.pl>
    <a...@4...com>
    <kqqbud$j5h$1@mx1.internetia.pl> <kqqg26$pa6$8@node2.news.atman.pl>
    <kqrkrs$ka6$1@mx1.internetia.pl> <kqrnjk$fgq$1@node2.news.atman.pl>
    <kqsb2s$t1t$1@mx1.internetia.pl> <kqsd2l$fgq$5@node2.news.atman.pl>
    NNTP-Posting-Host: 83.238.197.12
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: mx1.internetia.pl 1372782399 12289 83.238.197.12 (2 Jul 2013 16:26:39 GMT)
    X-Complaints-To: a...@i...pl
    NNTP-Posting-Date: Tue, 2 Jul 2013 16:26:39 +0000 (UTC)
    In-Reply-To: <kqsd2l$fgq$5@node2.news.atman.pl>
    X-Tech-Contact: u...@i...pl
    User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0.11) Gecko/20121123
    Icedove/10.0.11
    X-Server-Info: http://www.internetia.pl/
    Xref: news-archive.icm.edu.pl pl.comp.programming:203941
    [ ukryj nagłówki ]

    On 01.07.2013 19:08, Edek wrote:
    > Część teraz...
    >
    > Dnia pamiętnego Mon, 01 Jul 2013 18:24:17 +0200, Michoo wyjmując peta
    > oznajmił:
    >

    >> Co do samego algorytmu - potrzebne są trzy stany:
    >> przed_inicjalizacją, w_trakcie, po_inicjalizacji, nie da się tego zrobić
    >> na JEDNEJ fladze binarnej, można by użyć dwóch(i wprowadzić odpowiednie
    >> poprawki), ale po co?
    >
    > Nie, jest potrzebna monotonicznie rosnąca liczba, nie trzy stany. Mi
    > to zajęło z pół godziny żeby dojść dlaczego: spróbuj zastąpić
    > monotonicznie rosnącą stanami i albo udowodnij poprawność
    > albo udowodnij że jest problem.

    #define START_VALUE 2
    #define BEING_INITIALIZED 1
    #define INIT_DONE 0

    /* PRECONDITION:
    *once == START_VALUE
    */

    void fast_pthread_once( fast_pthread_once_t *once, void (*func)(void) )
    {
    /*01*/ if ( *once != INIT_DONE ) {
    /*02*/ check( pthread_mutex_lock(&mu) == 0 );
    /*03*/ if ( *once == START_VALUE ) {
    /*04*/ *once = BEING_INITIALIZED;
    /*05*/ check( pthread_mutex_unlock(&mu) == 0 );
    /*06*/ (*func)();
    /*07*/ check( pthread_mutex_lock(&mu) == 0 );
    /*08*/ *once = INIT_DONE;
    /*09*/ check( pthread_cond_broadcast(&cv) == 0 );
    /*10*/ } else {
    /*11*/ while ( *once != INIT_DONE ) {
    /*12*/ check( pthread_cond_wait(&cv, &mu) == 0 );
    /*13*/ }
    /*14*/ }
    /*15*/ check (pthread_mutex_unlock(&mu) == 0);
    /*16*/ }
    }

    Wszystkie zapisy i odczyty (poza linią 01) są chronione muteksem. Tak więc:
    A) w lini 01 może zostać albo odczytana wartość początkowa, wartość z
    linii 04 lub 08
    - w przypadku odczytu INIT_DONE pomijamy cały blok - inicjalizacja
    została już wykonana
    - w przypadku odczytu innej wartości rozpoczynamy blok synchronizowany B

    B) w linii 03 może zostać albo odczytana wartość początkowa, wartość z
    linii 04 lub 08
    - w przypadku wartości innej niż START_VALUE oczekujemy w liniach 11,12
    na zakończenie inicjalizacji [*] (deadlock przy wywołaniu rekurencyjnym)
    - w przypadku wartości START_VALUE zmieniamy ją na BEING_INITIALIZED i
    kończymy blok synchronizowany - od tego momentu żaden wątek w 01 ani 03
    nie odczyta wartości START_VALUE
    - Po zakończeniu inicjalizacji zapisujemy *once = INIT_DONE i wybudzamy
    wątki czekające w linii 12 - od tego momentu nie zostanie odczytana inna
    wartość niż INIT_DONE

    Czekające wątki po kolei kończą oczekiwanie 12->11->15.

    [*] Jeżeli wartość zmieniła się na INIT_DONE po odczycie w linii 01 ale
    przed otrzymaniem muteksu to nie czekamy w linii 12 tylko kończymy na 15.

    Pisane na szybko więc co przeoczyłem?

    > Ja potrafię to drugie.
    >
    Poproszę.

    --
    Pozdrawiam
    Michoo

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: