Práce s vlákny v C

Re:Práce s vlákny v C
« Odpověď #15 kdy: 20. 01. 2021, 03:11:28 »
Mimo puvodni dotaz.
Multithreading v C je pain a porad jednou nohou v pruseru. Business kod taky pain, prenositelnost a devops peklo.
A to nejenom pri vyvoji ale hlavne dale pri zmenovkach a udrzbe.
Neznam samozrejme pozadi tohoto programu, ale zvazil bych pouziti vhodnejsiho jazyka.

Treba v GO je to pres gorutiny s prstem v nose, mechanismus channelu je z bezpecny a blbuvzdorny
Nebo v Jave pri pouziti netty.io


Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #16 kdy: 20. 01. 2021, 04:02:52 »
Mimo puvodni dotaz.
Multithreading v C je pain a porad jednou nohou v pruseru. Business kod taky pain, prenositelnost a devops peklo.
A to nejenom pri vyvoji ale hlavne dale pri zmenovkach a udrzbe.
Neznam samozrejme pozadi tohoto programu, ale zvazil bych pouziti vhodnejsiho jazyka.

Treba v GO je to pres gorutiny s prstem v nose, mechanismus channelu je z bezpecny a blbuvzdorny
Nebo v Jave pri pouziti netty.io
Pthreads jsou “pain”, v C je vždy lepší použít Grand Central Dispatch (což je pro BSD, Linux i Windows). V C++ pak existují další vhodné knihovny.

Re:Práce s vlákny v C
« Odpověď #17 kdy: 25. 01. 2021, 09:00:54 »
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.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #18 kdy: 25. 01. 2021, 13:07:46 »
Stačí si přes channel nevhodně poslat pointer a je na světě problém úplně stejnej jako v C.
Jak "nevhodně"? Když vytvořím objekt a pak ukazatel na něj pošlu kanálem, tak příjemce s ním může normálně pracovat a GC ho nechá na pokoji, dokud na něj existují odkazy (když je v bufferu, tak do uzavření kanálu).

Re:Práce s vlákny v C
« Odpověď #19 kdy: 25. 01. 2021, 13:11:47 »
Jak "nevhodně"? Když vytvořím objekt a pak ukazatel na něj pošlu kanálem, tak příjemce s ním může normálně pracovat a GC ho nechá na pokoji, dokud na něj existují odkazy (když je v bufferu, tak do uzavření kanálu).
No právě. Vytvořím tak shared memory úplně stejně jako v C, se všema nebezpečíma, který to v C má. Žádná větší "bezpečnost" se v takovým případě neděje. Čili "blbuvzdorný" to moc není, dají se tam velice snadno udělat stejný průsery jako v C.


Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #20 kdy: 25. 01. 2021, 13:24:27 »
Jak "nevhodně"? Když vytvořím objekt a pak ukazatel na něj pošlu kanálem, tak příjemce s ním může normálně pracovat a GC ho nechá na pokoji, dokud na něj existují odkazy (když je v bufferu, tak do uzavření kanálu).
No právě. Vytvořím tak shared memory úplně stejně jako v C, se všema nebezpečíma, který to v C má. Žádná větší "bezpečnost" se v takovým případě neděje. Čili "blbuvzdorný" to moc není, dají se tam velice snadno udělat stejný průsery jako v C.
A co když ten odkazovaný objekt je immutable?

Re:Práce s vlákny v C
« Odpověď #21 kdy: 25. 01. 2021, 13:40:51 »
A co když ten odkazovaný objekt je immutable?
Pokud je immutable, tak samozřejmě k žádnému problému nedojde. Čili úplně stejně jako v C :) S tím rozdílem, že Go neumí konstanty hlídat tak dobře jako C :) (např. const field structu)

Re:Práce s vlákny v C
« Odpověď #22 kdy: 25. 01. 2021, 14:07:44 »
Takova mensi ilustrace:

https://play.golang.org/p/jjbq2b4NyI0

Kdyz si predstavim, ze obsah A a B je nedokumentovany a ja pisu jenom consumer(), asi budu hodne kroutit hlavou, co delam spatne...

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #23 kdy: 25. 01. 2021, 14:40:17 »
Takova mensi ilustrace:

https://play.golang.org/p/jjbq2b4NyI0

Kdyz si predstavim, ze obsah A a B je nedokumentovany a ja pisu jenom consumer(), asi budu hodne kroutit hlavou, co delam spatne...
A proto, milé děti, nepraste a sdílejte jen immutable objekty.

Re:Práce s vlákny v C
« Odpověď #24 kdy: 25. 01. 2021, 15:36:05 »
A proto, milé děti, nepraste a sdílejte jen immutable objekty.
To je sice dobra rada a radostne bych souhlasil, jenze imutabilita nejde v Go vynutit a dokonce ani zkontrolovat.

Takze v Go proste zadny dobry reseni nemas. Imutabilitu nevynutis, ze struct neobsahuje (na jakekoliv urovni!) zadny pointer nezkontrolujes a jediny, co ti zustane, jsou neopodstatnena velkolepa prohlaseni, ze kanaly jsou "bezpecne a blbuvzdorne", pricemz nejsou ani jedno, protoze narozdil od Erlangu v gocku implementovali CSP ponekud nedomrle. O cemz se ale nesmi mluvit, protoze Go je dokonale ve sve jednoduchosti ;)

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #25 kdy: 25. 01. 2021, 16:00:59 »
A proto, milé děti, nepraste a sdílejte jen immutable objekty.
To je sice dobra rada a radostne bych souhlasil, jenze imutabilita nejde v Go vynutit a dokonce ani zkontrolovat.

Takze v Go proste zadny dobry reseni nemas. Imutabilitu nevynutis, ze struct neobsahuje (na jakekoliv urovni!) zadny pointer nezkontrolujes a jediny, co ti zustane, jsou neopodstatnena velkolepa prohlaseni, ze kanaly jsou "bezpecne a blbuvzdorne", pricemz nejsou ani jedno, protoze narozdil od Erlangu v gocku implementovali CSP ponekud nedomrle. O cemz se ale nesmi mluvit, protoze Go je dokonale ve sve jednoduchosti ;)
Tolik k alternativní realitě. Skutečnost je, že se to všeobecně ví a ty si jen s velkým kraválem myslíš, žes objevil Ameriku ;)

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #26 kdy: 25. 01. 2021, 16:16:45 »
A proto, milé děti, nepraste a sdílejte jen immutable objekty.
jenze imutabilita nejde v Go [...] zkontrolovat.
Takze v Go proste zadny dobry reseni nemas. [...] ze struct neobsahuje (na jakekoliv urovni!) zadny pointer nezkontrolujes
Nic z toho není pravda, kontrolovat kompozici objektů jde a dokonce se to v částech standardní knihovny využívá. Donovan a Kernighan mají v knize “The Go programming language” příklady.

Re:Práce s vlákny v C
« Odpověď #27 kdy: 25. 01. 2021, 16:45:15 »
Nic z toho není pravda, kontrolovat kompozici objektů jde a dokonce se to v částech standardní knihovny využívá. Donovan a Kernighan mají v knize “The Go programming language” příklady.
Nevím, co si představuješ pod "kontrolovat kompozici objektů". Jestli to nějaký řešení má, tak mi ho ukaž na tom příkladu.

1. Píšu jenom consumer(), producer() a main()
2. Neznám obsah B, není dokumentovaný
3. Chci, aby na mě překladač zařval, že dělám nebezpečnou věc - buď že měním něco, co měnit nemám, nebo že používám něco, co se mi pod rukama může změnit. Oboje v C udělat jde.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Práce s vlákny v C
« Odpověď #28 kdy: 25. 01. 2021, 16:55:07 »
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 :)

Re:Práce s vlákny v C
« Odpověď #29 kdy: 25. 01. 2021, 16:58:46 »
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?