reklama

Synchronizace - obrácený semafor

n

Re:Synchronizace - obrácený semafor
« Odpověď #15 kdy: 30. 10. 2017, 20:17:29 »
Hele, nechci te nak moc presvedcovat, protoze neznam uplne situaci, ale uz to tu nekdo rikal. Nestaci na to opravdu std::atomic ?
Protoze:
 1) vic lightly operaci asi nesezenes. Protoze nakonec nakonec stejne budes potrebovat "thread-safe" counter.
 2) ruzne typy futuru muzou byt fakt hodne overhead, ktery nepotrebujes resit.
 3) ano, samozrejme se to musi nejak inicializovat, ale stejne, pokud se tvuj thread pusti drive/soucasne s ostatnima threadama, tak stejne  tezko muzes urcit, jestli uz dobehly nebo ne jinak, nez ze nekde zvenku reknes, co uz melo dobehnout. Ano promise/future ... ale imho atomic counter bude fakt lightweight mnohem vic a muze stacit. Ale fakt neznam cely problem, takze tezko rict...
4) Nepotrebujes nakonec vlastne jen atomic-- ?

reklama


Re:Synchronizace - obrácený semafor
« Odpověď #16 kdy: 30. 10. 2017, 20:58:24 »
Vola sa to Barrier alebo WaitGroup.

Skoro urcite to riesis zle. Na cakanie na dokoncenie operacie (alebo operacii) je lepsi promise/future. S nimi nemusis riesit take tie problemy ako "pripocital som?", "nie je tam race condition?" a podobne. Ked sa ti podari deadlock, tak byva deterministicky. Caka to prave na hodnoty, ktore chces pouzit.

Ne sorry, "pripocital som?" fakt je ukazuje na lehce neschopné programování. Tohle fakt nastat nemůže. Už třeba proto, že bežící task může provádět increment/decrement přes RAII, takže je to i exception safe. Při vzniku tasku zavolá inc, při dokončení tasku nebo jeho destrukci zavolá dec. Race condition tam určitě není.

Stejným způsobem třeba podobný problém nenastane při refcountingu, což je podobný problém, akorát tam jde o zničení objektu když refcount klesne na nulu. Tady jde o odblokování vlákna.

Hele, nechci te nak moc presvedcovat, protoze neznam uplne situaci, ale uz to tu nekdo rikal. Nestaci na to opravdu std::atomic ?

No, šlo by tam mít atomic counter, ale funkci wait() mi atomic neudělá, leda přes nějaký spinlock. Na zastavení vlákna potřebuju mutex a condvar. No a když už tam mám mutex, tak ten atomic je už zbytečný. Možná ještě rychlejší by to bylo, kdyby counter byl atomic, tim bych se vyhnul zamykání při inc/dec.

Ale já jsem chtěl vědět, jestli se tohle někde nepoužívá, že bych uspůsobil rozhraní a název abych to měl standardní

 

reklama