-
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 21:18:51 +0200
Organization: Netia S.A.
Lines: 85
Message-ID: <kqv9m8$ej2$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>
<kquuvu$c01$1@mx1.internetia.pl> <kqv484$hb1$7@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 1372793352 14946 83.238.197.12 (2 Jul 2013 19:29:12 GMT)
X-Complaints-To: a...@i...pl
NNTP-Posting-Date: Tue, 2 Jul 2013 19:29:12 +0000 (UTC)
In-Reply-To: <kqv484$hb1$7@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:203943
[ ukryj nagłówki ]On 02.07.2013 19:56, Edek wrote:
> Dnia pamiętnego Tue, 02 Jul 2013 18:16:18 +0200, Michoo wyjmując peta
> oznajmił:
>> - w przypadku odczytu INIT_DONE pomijamy cały blok - inicjalizacja
>> została już wykonana
>
> Tak, ale nie miała miejsce synchronizacja.
Jaka synchronizacja?
>>
>> Pisane na szybko więc co przeoczyłem?
>
> Model pamięci C++11?
pthreads z nie_pojebaną_architekturą (tm)
> Model Pamięci ma taką cechę że zapis w wątku A jest widoczny w wątku B
> gdy nastąpi uszeregowanie poprzez release w A i acquire w B. Lock() to
> aquire, unlock() to release, albo można w ogóle każdą operację na
> mutexie traktować 'stricter' jako sequence point - czyli jeżeli oba
> wątki przejdą op na mutex to zapis w A może być odczytany w B.
Gwarancja jest oidp silniejsza - jeżeli wątek kończy release to zmiany
są "commited" w pamięci.
> Jeżeli
> nie ma przejścia przez mutex obu wątków mamy race, czyli wątek B
> czyta potencjalnie śmieci.
Czyta albo stary stan, albo nowy stan[*] a nie śmieci - dlatego m.i. się
używa sig_atomic_t - pierwotne rozwiązanie też to zakłada.
[*] W praktyce nawet na NUMA jest utrzymywana spójność cache więc od
momentu zapisu z cache do pamięci wszystkie odczyty będą miały nowy stan.
> Zapis dotyczy zmiennych użytych tutaj i wszystkich
> zapisów w func(), które po przejściu algorytmu muszą być widoczne.
Masz barierę na lock() w linii 07 zaraz po wywołaniu func() a dopiero
potem modyfikację stanu zmiennej w 08.
>
> Uff, definicje z głowy ;). Wątek A i wątek B i numery linii,
> możliwa sekwencja:
>
> A linie 1 do 5 (w 2 i 5 jest mutex)
> A 6: konstruktor (po to jest ten algorytm) może zapisać pola
> A 7: mutex (acquire)
> A 8: once = INIT_DONE
>
> B 1: (once == INIT_DONE) == true (co nie musi być prawdą, ale może)
lock() synchronizuje pamięć
> B 17: wątek używa wartości z A 6, które nie muszą być poprawne,
> bo wątek B nie przeszedł przez żaden mutex. Może odczytać
> śmieci, czyli mamy race
No właśnie nie może, bo to oznacza, że masz architekturę na której
zmiany wykonane po barierze są widoczne przed zmianami wykonanymi przed
barierą.
>
> Powyższa sekwencja może jest mało prawdopodobna, ale mamy
> data race.
Jeżeli chcesz się trzymać litery standardu C++11 to sam odczyt w linii
01 oryginalnego rozwiązania to jest data race, więc całe dalsze
wykonanie to UB.
> Dlatego ten algorytm jest genialny, kolejne
> przejścia są bez synchronizacji.
Powiedziałbym, że jest "normalny" - działa w obrębie pewnych założeń.
Tyle, że rozwiązuje problem, którego imo nie ma przez nałożenie
ograniczenia na liczbę once a przy tym nie eliminując problemu z UB.
--
Pozdrawiam
Michoo
Następne wpisy z tego wątku
- 02.07.13 23:06 Edek
- 03.07.13 02:29 Michoo
- 03.07.13 04:08 Edek
- 09.07.13 14:42 firr
- 10.07.13 15:41 firr
Najnowsze wątki z tej grupy
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
- Młodzi programiści i tajna policja
- Ada 2022 Language Reference Manual to be Published by Springer
Najnowsze wątki
- 2024-11-14 Dobra zmiana
- 2024-11-14 Czy prezydent może ułaskawić od zadośćuczynienia? [A. Lepper odszkodowania]
- 2024-11-14 Gliwice => Network Systems Administrator (IT Expert) <=
- 2024-11-14 Gliwice => Administrator Systemów Sieciowych (Ekspert IT) <=
- 2024-11-13 Filtr do pompy ruskiej
- 2024-11-12 Gdzie kosz?
- 2024-11-13 elektrycznie
- 2024-11-12 Jebane kurwa, kurwy.
- 2024-11-13 karta parkingowa
- 2024-11-13 Wl/Wyl (On/Off) bialy/niebieski
- 2024-11-12 I3C
- 2024-11-13 Kraków => DevOps Engineer (Junior or Regular level) <=
- 2024-11-13 Łódź => Senior SAP HANA Developer <=
- 2024-11-13 Zabrze => Senior PHP Symfony Developer <=
- 2024-11-13 Karlino => Konsultant wewnętrzny SAP (FI/CO) <=