.[ ČeskéHry.cz ].
Volatile proměnná pro synchronizaci

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
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

PříspěvekZaslal: 15. září 2013, 17:22:40    Předmět: Volatile proměnná pro synchronizaci Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 602

PříspěvekZaslal: 15. září 2013, 17:40:55    Předmět: Re: Volatile proměnná pro synchronizaci Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 765
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 15. září 2013, 17:51:13    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Solid.Sn



Založen: 08. 08. 2009
Příspěvky: 55

PříspěvekZaslal: 15. září 2013, 17:54:28    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 602

PříspěvekZaslal: 15. září 2013, 18:12:08    Předmět: Odpovědět s citátem

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 Smile
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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tringi



Založen: 28. 07. 2007
Příspěvky: 289

PříspěvekZaslal: 15. září 2013, 19:08:20    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna