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!newsfeed2.atman.pl!newsfeed.
    atman.pl!.POSTED!not-for-mail
    From: Edek <e...@g...com>
    Newsgroups: pl.comp.programming
    Subject: Re: pytanie z mutexów
    Date: Mon, 1 Jul 2013 11:02:13 +0000 (UTC)
    Organization: ATMAN - ATM S.A.
    Lines: 115
    Message-ID: <kqrnjk$fgq$1@node2.news.atman.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>
    NNTP-Posting-Host: 87-205-33-79.adsl.inetia.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    X-Trace: node2.news.atman.pl 1372676533 15898 87.205.33.79 (1 Jul 2013 11:02:13 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Mon, 1 Jul 2013 11:02:13 +0000 (UTC)
    User-Agent: Pan/0.139 (Sexual Chocolate; GIT bf56508 git://git.gnome.org/pan2)
    Xref: news-archive.icm.edu.pl pl.comp.programming:203925
    [ ukryj nagłówki ]

    Dnia pamiętnego Mon, 01 Jul 2013 12:05:05 +0200, Michoo wyjmując peta
    oznajmił:

    > On 01.07.2013 01:47, Edek wrote:

    >> mając do zamknięcia n,m,l,... zamyka się n, a potem try_lockiem
    >> pozostałe. Jeżeli któryś się nie zamknie, bo zajęty, zwalnia się już
    >> zamknięte i ten który był zajęty jest pierwszy do kolejnej rundy -
    >> przez co proces czeka na tym locku aż się zwolni, bo pierwszy jest lock().
    >
    > W takiej sytuacji możesz mieć live-lock - wystarczą już dwa procesy
    > "wymieniające się" dwoma blokadami.

    Praktycznie ten algorytm w implementacji boost-a ma jeszcze kilka
    yieldów.

    >> Do zagłodzenia może dojść.
    >
    > Jest jeszcze gorzej - nie ma warunku postępu.

    To nie jest gorzej. Możliwy deadlock/starvation zawsze kiedyś się zdarzą,
    tego typu live-lock nawet jeżeli się zdarzy, to tymczasowo. Konsekwencje
    live-locka w tym konkretnym przypadku są praktycznie wyłącznie teoretyczne.

    >>>>> Każdy proces wchodząc do sekcji krytycznej pobiera potrzebne mu blokady
    >>>>> w kolejności A-F. Rozwiązuje to problem wzajemnego wykluczania([*]).
    >>>>> Problem zagłodzenia nie wystąpi na pewno gdy muteksy budzą w kolejności
    >>>>> FIFO, przy braku tej gwarancji do zagłodzenia może dojść[**] więc
    >>>>> najlepiej chyba ją zapewnić przez kombinację mutex+lista+condition
    >>>>> variable (dopóki !pierwszy na liście).
    >>
    >> Nope. Trzeba jeszcze dopisać się do list dzielonych z pozostałymi
    >> procesami, inaczej one też mogą zagłodzić/być zagłodzone, np.
    >> mapa list z maską jako kluczem...
    >
    > Nie zrozumiałem. Skoro kolejką emulujemy listę oczekujących na muteksie
    > to oczywistym jest, że ona musi być współdzielona.

    Na którym mutexie miałaby być lista wszystkich sąsiadów? Nie da się
    podzielić grafu w ten sposób.

    >>>>> [*] Czyim imieniem nazywamy ten algorytm - nie pamiętam. Jest to daleka
    >>>>> wariacja Lamporta.
    >>>>> [**] Choćby a i b "wymieniające się" muteksem A mogą zagłodzić c.
    >>
    >> ... a wtedy a i b dopiszą się do kolejki z c i c będzie pierwsze.
    >
    > Nie rozumiem.

    W tej pracy linkowanej przez A.L. w referencjach jest edge-based solution,
    wspomniana jest we wstępie. Jeszcze nie czytałem, a sam mogłem coś pokręcić
    (biorąc pod uwagę fakt że moje 10 minut < publikacja - nic dziwnego ;) ).

    >> Nie przemyślałem tylko jak to zaimplementować, bo trzeba jeszcze chronić
    >> same kolejki o ile nie ma kolejek lock-free z peek() i mieć jakąś
    >> politykę reagowania na a przed b na jednej liście a b przed a na drugiej
    >> - random() dałby radę.
    >
    > Używasz parę blokad:
    > lock(Xa);
    > dodaj_na_koniec_kolejki(procId,a);
    > unlock(Xa);
    >
    > do{
    > cond_wait(Ya);
    > }while(head(a)!=procId);
    > do_stuff();
    > lock(Xa);
    > usun_zpoczatku_kolejki(a);
    > unlock(Xa);
    > unlock(Ya);

    Nie zrozumiałem. Gdzie jest lock(Ya)? Co robi do_stuff()? I gdzie to pasuje
    do całości?

    >> Wiele algorytmów "wątkowych" nie ma ani standardu ani nazwy.
    >
    > Istnieją pewne "wzorce" czy "idiomy". Nie znałem takiego. Jak widać
    > wystarczyła drobna wariacja tego co przedstawiłem.

    W algorytmach wątkowych najczęściej nie ma czegoś takiego jak
    drobna wariacja. W zasadzie każda zmiana, nawet drobna, wymaga
    dowodu od początku. Przykład:

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2
    008/n2660.htm#AppendixSource

    Część ludzi twierdzi, że algorytm działa po "drobnej zmianie",
    gdy _fast_pthread_once_per_thread_epoch jest nie monotonicznie
    rosnąca ale flagą - a łatwo udowodnić, że wtedy całość się rozsypie.

    Każda zmiana wymaga dowodu od początku.

    >> Schematy współpracy: skoro się wykluczają mogą w ramach wykluczenia
    >> przekazywać dane. Albo mogą mieć kolejki, które są liśćmi w drzewie
    >> kolejności locków, więc są pomijalne dla poprawności.
    >
    > Mogą. Właśnie od "mogą" zależy bardzo dużo jeżeli chodzi o wątki. Jeżeli
    > masz problem producenci-konsumenci to daje się go rozwiązać lock-free.

    Zazwyczaj w takich sytuacjach używa się:
    a = try_get()
    if (a == null) {
    zwolnij_wszystkie_locki
    a = get();
    od początku ustawiamy się w kolejce do locków
    }

    To nie wymaga ani zmiany głównego algorytumu ani kolejek lock-free.
    Dlatego, że try_get zamyka jeden lock jako ostatni, na krótko,
    bez wait(), a jeżeli ma być wait() to już trzeba wszystko zwolnić
    bo wait() zalicza się w myśleniu o deadlockach do locków.

    --
    Edek

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: