Práce s vlákny v C

Idris

  • *****
  • 1 257
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #30 kdy: 25. 01. 2021, 17:03:36 »
Nevím, co si představuješ pod "kontrolovat kompozici objektů".
Chci, aby na mě překladač zařval,
To, cos napsal, zjistit, jestli někde v hloubi objektového grafu není ukazatel.
Akorát už měníš “zadání”, nejdřív píšeš “není možné”, a pak “chci, aby překladač zařval”. To není totéž. Nejdříve si přečti *pozorně* tu knihu. Pak se nauč vyjadřovat přesně. No a pak si můžeme zase popovídat ;)

P.S. A ano, bylo by mnohem lepší, kdyby Go (a vůbec všechny jazyky s kompozitními typy) mělo u polí modifikátor “initonly”, ubylo by blábolů prvotních i blábolů reagujících na bláboly :)
Nenašel by se nějaký příklad, co není za paywallem?
Z hlavy nevím, ale můžu zkusit něco najít o “obvyklých podezřelých” (například Cheney apod.). Stay tuned ;)


Re:Práce s vlákny v C
« Odpověď #31 kdy: 25. 01. 2021, 17:12:14 »
To, cos napsal, zjistit, jestli někde v hloubi objektového grafu není ukazatel.
Coz prave PRAKTICKY nejde. Pouzivam nejakou knihovnu. Tahle informace neni soucasti API, cili i kdyz si projdu zdrojaky, je mi to platny jak mrtvymu zimnik, protoze uz s nasledujici zmenou MINOR verze se to muze zmenit.

A vubec nemusi jit o cizi knihovnu. Muze jit o dve casti jedne aplikace, ktere pisou dva tymy. Jeden vubec nevi, ze druhy spoliha na to, ze tam ukazatel neni.

A ani o dva tymy nemusi jit. Muzu to klidne psat sam a po trech letech uz si vubec nepamatuju, ze jsem na to, ze v B zadny ukazatel neni, spolihal. Bezelstne ho tam pridam a najednou mi to zacne na produkci delat psi kusy, neznamo proc a jenom obcas.

Akorát už měníš “zadání”, nejdřív píšeš “není možné”, a pak “chci, aby překladač zařval”. To není totéž.
To JE totez. Pokud prekladac nezarve, tak to neni ROZUMNE, PRAKTICKY mozne. Protoze pokud ta informace neni ve zdrojaku (a opakuju: C to umi ve zdrojaku vyjadrit) a prekladac ji neumi zkontrolovat, muzu o tom, ze to jde, tak leda pindat na rootu a v praxi to porad bude u zakaznika zahadne padat. Coz neni moje definice "bezpecneho" reseni konkurentnosti.
« Poslední změna: 25. 01. 2021, 17:13:48 od Mirek Prýmek »

Re:Práce s vlákny v C
« Odpověď #32 kdy: 25. 01. 2021, 17:15:54 »
Z hlavy nevím, ale můžu zkusit něco najít o “obvyklých podezřelých” (například Cheney apod.). Stay tuned ;)
Jezkovanoho, nedelej z toho vedu. Ukazal jsem problematicky priklad na par radku. Pokud jde nejak opravit, tak to bude oprava na par radku. Tak shut up and show the code :)

Idris

  • *****
  • 1 257
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #33 kdy: 25. 01. 2021, 17:18:58 »
Ať už k tomu zdroják máš nebo ne, místo (abych použil tvou terminologii) pindání si to kontroluj za běhu (třeba asercí), pak ti to bude fungovat i s knihovnami nebo pluginy třetích stran a pokud rozumně testuješ, k zákazníkovi se taková chyba nedostane.

BTW ta kniha je fakt dobrá, protože se nezaměřuje úzce jen na technické věci, ale právě i na testování a jiné užitečné postupy. Prozřel bys. Možná. Doufám. :P

Idris

  • *****
  • 1 257
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #34 kdy: 25. 01. 2021, 17:19:46 »
Z hlavy nevím, ale můžu zkusit něco najít o “obvyklých podezřelých” (například Cheney apod.). Stay tuned ;)
Jezkovanoho, nedelej z toho vedu. Ukazal jsem problematicky priklad na par radku. Pokud jde nejak opravit, tak to bude oprava na par radku. Tak shut up and show the code :)
Tohle nebylo na tebe.


Re:Práce s vlákny v C
« Odpověď #35 kdy: 25. 01. 2021, 17:27:33 »
Ať už k tomu zdroják máš nebo ne, místo (abych použil tvou terminologii) pindání si to kontroluj za běhu (třeba asercí), pak ti to bude fungovat i s knihovnami nebo pluginy třetích stran a pokud rozumně testuješ, k zákazníkovi se taková chyba nedostane.
Tvl, to je jak kdyz mluvim se svyma deckama: ja jsem chtela... za chvilku... mozna... kdyby... jo, nekdy...

Tak nam to elegantni reseni ukaz, ne? Myslim, ze kdyz ty dva radky kodu uvidime, prozreme daleko spis, nez kdyz budes trousit odkazy na knizky, ktery nemame k dispozici.

Tohle nebylo na tebe.
Ja vim.

Re:Práce s vlákny v C
« Odpověď #36 kdy: 25. 01. 2021, 18:42:30 »
Treba v GO je to pres gorutiny s prstem v nose, mechanismus channelu je z bezpecny a blbuvzdorny
S tou bezpečností ani blbuvzdornstí bych to nepřeháněl. Stačí si přes channel nevhodně poslat pointer a je na světě problém úplně stejnej jako v C. A vzhledem k tomu, že pointery na structy jsou tak nějak default... Zákeřnější varianta stejné chyby je poslat si sice kopii structu, ale nevšimnout si, že má přes pointer embeddovaný jiný struct. Moc pěkná chyba, hledat ji je čirá extáze :)

Opravdu blbuvzdornou konkurentnost má Erlang, kde chybu tohodle typu udělat z principu nejde, protože sdílet paměť mezi vlákny ("procesy") prostě nejde a basta :) I tam samozřejmě pořád zůstává možnost deadlocku.

No to je sice pravda, lec musim s tim pointerem aktivne prasit dale v main threadu.
Pokud pouzivam aspon trochu stabni kulturu, poslu pointer do IN channelu a v main threadu zapominanm na jeho existenci, tam se to bezpecne posle do jedne instance gorutiny (tudiz nenastane situace, ze 2 gorutiny delaji na stejnem pointeru) a vysledny pointer na vysledny gorutinou modifikovany struct nacpu  do OUT channelu, odkud si to v main threadu zase vytahnu.

Takze staci nebyt uplny dobytek a prace v GO je rozumne bezpecna.


Re:Práce s vlákny v C
« Odpověď #37 kdy: 25. 01. 2021, 18:45:16 »
Takze staci nebyt uplny dobytek a prace v GO je rozumne bezpecna.
A to prave nestaci. Protoze v te strukture, kterou posilas, muze byt nejaky pointer z te odesilajici goroutiny, a ty o tom vubec nevis (nejaka funkce si tam ulozila neco, cos necekal, ze si tam ulozi).

Jak rika Idris, musel bys kontrolovat cely strom - ne jenom tu horni strukturu, ale i vsechny ji odkazovane struktury.

Idris

  • *****
  • 1 257
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #38 kdy: 25. 01. 2021, 19:17:44 »
Treba v GO je to pres gorutiny s prstem v nose, mechanismus channelu je z bezpecny a blbuvzdorny
S tou bezpečností ani blbuvzdornstí bych to nepřeháněl. Stačí si přes channel nevhodně poslat pointer a je na světě problém úplně stejnej jako v C. A vzhledem k tomu, že pointery na structy jsou tak nějak default... Zákeřnější varianta stejné chyby je poslat si sice kopii structu, ale nevšimnout si, že má přes pointer embeddovaný jiný struct. Moc pěkná chyba, hledat ji je čirá extáze :)

Opravdu blbuvzdornou konkurentnost má Erlang, kde chybu tohodle typu udělat z principu nejde, protože sdílet paměť mezi vlákny ("procesy") prostě nejde a basta :) I tam samozřejmě pořád zůstává možnost deadlocku.

No to je sice pravda, lec musim s tim pointerem aktivne prasit dale v main threadu.
Pokud pouzivam aspon trochu stabni kulturu, poslu pointer do IN channelu a v main threadu zapominanm na jeho existenci, tam se to bezpecne posle do jedne instance gorutiny (tudiz nenastane situace, ze 2 gorutiny delaji na stejnem pointeru) a vysledny pointer na vysledny gorutinou modifikovany struct nacpu  do OUT channelu, odkud si to v main threadu zase vytahnu.

Takze staci nebyt uplny dobytek a prace v GO je rozumne bezpecna.
Tak jest. Taky v tom nevidím nějaký zásadní problém. Ani nejde IMHO o štábní kulturu, stačí používat mozek.
Na druhou stranu, i přes Prýmkovu hysterii jde o hezký podnět k zamyšlení.

Idris

  • *****
  • 1 257
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #39 kdy: 25. 01. 2021, 19:21:18 »
Takze staci nebyt uplny dobytek a prace v GO je rozumne bezpecna.
A to prave nestaci. Protoze v te strukture, kterou posilas, muze byt nejaky pointer z te odesilajici goroutiny, a ty o tom vubec nevis (nejaka funkce si tam ulozila neco, cos necekal, ze si tam ulozi).
Jak rika Idris, musel bys kontrolovat cely strom - ne jenom tu horni strukturu, ale i vsechny ji odkazovane struktury.
Tak ale co ti brání? Si to třeba v jednotkových testech zkontroluj, vždyť to není problém.

Re:Práce s vlákny v C
« Odpověď #40 kdy: 25. 01. 2021, 19:24:40 »
Takze staci nebyt uplny dobytek a prace v GO je rozumne bezpecna.
A to prave nestaci. Protoze v te strukture, kterou posilas, muze byt nejaky pointer z te odesilajici goroutiny, a ty o tom vubec nevis (nejaka funkce si tam ulozila neco, cos necekal, ze si tam ulozi).

Jak rika Idris, musel bys kontrolovat cely strom - ne jenom tu horni strukturu, ale i vsechny ji odkazovane struktury.

Tomu rozumim, psal jsem o rozumne blbvzdornosti hlavne v porovnani s C.
Mechanismus pointeru a channelu neni slozity na pochopeni.

V normalnim programu mi ty pointerovane data budou vznikat lokalne v ramci loop smycky (a nasledne hned zapominany), poslany do IN channelu a vysledek vycitan z OUT channelu.
Samozrejme nemuzu posilat pointery na volatilni data.
V Jave to same, kdyz poslu ArrayList, do jehoz polozek mi nekdo z boku hrabe, dopadne to blbe.
V Jave sice muzes tomuto zamezit (https://dev.to/monknomo/make-an-immutable-object---in-java-480n), ale kdo to v realu dela.
Pokud opravdu nastane situace, ze mi nekdo modikuje predavaci datovou strukturu, je neco hodne blbe v samotnem navrhu programu. Ale samozrejme je pravda, ze moznost definice immutable jednoduchou syntaxi je velice prinosna featura.

Pokud budu chtit v danem pripade zamezit tomuto v GO, staci do channelu posilat pointery na hluboke kopie danych struktur a hned je v main threadu zapominat.

Re:Práce s vlákny v C
« Odpověď #41 kdy: 25. 01. 2021, 19:25:41 »
Tak jest. Taky v tom nevidím nějaký zásadní problém. Ani nejde IMHO o štábní kulturu, stačí používat mozek.
Na druhou stranu, i přes Prýmkovu hysterii jde o hezký podnět k zamyšlení.
Jakou hysterii?! Ja jenom konstatuju, co si myslim a svoje tvrzeni dokladam konkretnim prikladem. Nevylucuju, ze se mylim, ten priklad jde nejak elegantne opravit a tim mou tezi zpochybnit. Ale zatim to jaksi nikdo neudelal. A pritom staci pouzit mozek a napsat par radek kodu misto desitek radek prispevku, ze :)

Tak ale co ti brání? Si to třeba v jednotkových testech zkontroluj, vždyť to není problém.
Brani mi v tom to, ze to neumim udelat tak, aby to bylo spolehlive (jeste porad se bavime o "bezpecnosti", nebo uz ne?)

A to je presne ten duvod, proc chci od tebe priklad. Protoze jenom na ten ti pripadne muzu dat protipriklad. Tvrzeni "staci pouzivat mozek" vyvratit neumim, cili je pro me dost bezcenne...

Idris

  • *****
  • 1 257
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #42 kdy: 25. 01. 2021, 19:28:16 »
Takze staci nebyt uplny dobytek a prace v GO je rozumne bezpecna.
A to prave nestaci. Protoze v te strukture, kterou posilas, muze byt nejaky pointer z te odesilajici goroutiny, a ty o tom vubec nevis (nejaka funkce si tam ulozila neco, cos necekal, ze si tam ulozi).

Jak rika Idris, musel bys kontrolovat cely strom - ne jenom tu horni strukturu, ale i vsechny ji odkazovane struktury.
Pokud budu chtit v danem pripade zamezit tomuto v GO, staci do channelu posilat pointery na hluboke kopie danych struktur a hned je v main threadu zapominat.
K tomu bych dodal: CoW. A je po problému.

Idris

  • *****
  • 1 257
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #43 kdy: 25. 01. 2021, 19:30:41 »
Standa B. právě navrhnul ještě lepší řešení než kontrolu. Problem solved.

Re:Práce s vlákny v C
« Odpověď #44 kdy: 25. 01. 2021, 19:35:45 »
Krom toho, nejsem si uplne jisty, ze to je reseni pro vsechny situace. Musim zapremyslet :)
Minimalne samozrejme nefunguje pro ruzny resourcy typu sitovy spojeni, filedescriptor apod., ale to asi neni potreba zduraznovat.

Spis premyslim, jestli by tam nebyly nejaky jiny speky :)
« Poslední změna: 25. 01. 2021, 19:40:19 od Mirek Prýmek »