Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Solid.Sn
Založen: 08. 08. 2009 Příspěvky: 55
|
Zaslal: 15. září 2013, 17:22:40 Předmět: Volatile proměnná pro synchronizaci |
|
|
Ahoj,
zkouším co nejjednodušeji zařídit synchronizaci mezi dvěma procesy a zajímalo by mě, jestli je můj postup v pořádku.
Používám globální proměnnou
kód: |
volatile bool Sync = false; |
, kterou nastavím na false. Spustím dvě vlákna, v prvním čekám pomocí while na změnu proměnné Sync:
kód: |
while ( !Sync ); // čekání
// pokračování po nastavení Sync - po ukončení zpracovávání druhého vlákna |
a ve druhém prostě něco zpracovávám a až se to dokončí, pak změním Sync:
kód: |
// zpracovávání
Sync = true; // nastavení Sync
// ukončení vlákna
|
Dle toho, co jsem se dočetl by to mělo fungovat tak, že po dokončení zpracovávání v druhém vlákně se nastaví Sync, vlákno se ukončí a první vlákno bude pokračovat. Je to tak bezpečné? Funguje to, ale nevim, jestli v tom někde nění nějaký problém. Volatile by mělo, pokud vím, zajistit, aby se hodnota proměnné získávala vždy z paměti (ne z cache) a tak mi příjde, že to musí být v pořádku. Nejde tady o synchronizaci hodnoty proměnné jako takové, jde pouze o to "přepnutí", které i kdyby nebylo atomické v tomhle případě nevadí...
Nebo se pletu? |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 15. září 2013, 17:40:55 Předmět: Re: Volatile proměnná pro synchronizaci |
|
|
Myslíš asi mezi dvěma thready v rámci procesu.
Ano fungovat to bude, bezpečné to je, akorát vlákno, které čeká ti zbytečně spálí jedno jádro úplně zbytečně (je otázka, kdy/jak dlouho, ale i tak). Použil bych čekání na event/condition variable, to řešení co máš rozhodně není best practice. Pokud jenom čekáš, až jiné vlákno skončí, můžeš použít wait na vlákno/join. |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 15. září 2013, 17:51:13 Předmět: |
|
|
Jak psal mar - reseni pomoci synchronizacnich primitiv systemu pravdepodobne bude efektivnejsi a cistsi, zvlast pokud takhle budes cekat delsi dobu (milisekundy nebo dele).
Aktivni cekani muze mit smysl, pokud potrebujes drzet jednoduchy mutex na nekolika instrukci a chces se vyhnout systemovemu volani, ale obecne bych se tomu spis vyhnul (uz jenom proto, ze udelat spravne i ten trivialni mutex je dost netrivialni). _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
Solid.Sn
Založen: 08. 08. 2009 Příspěvky: 55
|
Zaslal: 15. září 2013, 17:54:28 Předmět: |
|
|
Jo, špatně jsem to v té první větě napsal, myslel jsem vlákna, ne procesy...
Dost jsem to ořezal - nebude tam pouze while ( !Sync );. V rámci té smyčky se ještě bude dělat něco jiného + tam dám nějaký sleep právě aby to nečekalo aktivně. Šlo mi ale o ten princip synchronizace, zda v tom nebude nějaký problém...
Děkuji |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 15. září 2013, 18:12:08 Předmět: |
|
|
Solid.Sn napsal: |
Dost jsem to ořezal - nebude tam pouze while ( !Sync );. V rámci té smyčky se ještě bude dělat něco jiného + tam dám nějaký sleep právě aby to nečekalo aktivně. |
No myslím si, že tenhle způsob (volatile proměnná + sleep) není vůbec dobrý nápad (záleží ale na tom, co se přesně snažíš udělat a to nevíme
Mnohem lepší je čekat na event a sleep úplně vyhodit - co se stane, když se ti behěm sleepu nastaví flag a budeš zbytečně čekat.
Naopak pokud dáš sleep malý, tak si tím nemusíš pomoct. No a nakonec nemáš nikde záruku, že sleep bude čekat přesně tu dobu, kterou chceš. |
|
Návrat nahoru |
|
 |
Tringi

Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 15. září 2013, 19:08:20 Předmět: |
|
|
Dokud ten kód nebude volán stokrát za sekundu, není nutné nad tím přemýšlet. _________________ WWW | GitHub | TW |
|
Návrat nahoru |
|
 |
|