Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 8. leden 2014, 10:09:44 Předmět: Přerušení cyklu v threadu |
|
|
Mám thread, na kterém běží velký výpočet - je tam dlouhý cycklus. Korektní cesta, jak vlákno ukončit je, myslím, přidat k podmínce do cyklu ještě nějaký bool flag "isAborted". Tento flag pak nastavím na true z main threadu (třeba když uživatel klikne na tlačítko abort).
Teď ta otázka:
Ten flag se sdílí mezi thready, tudíž by tam měl být Mutex. Ale to je brzda, kterou si v takovém výpočtu nemůžu dovolit. Implementoval jsem to bez mutexu jako "volatile int", může to stačit? Říkal jsem si, že kdyby se ta proměnná isAborted dostala do nekonzistentního stavu, tak jediný, co se může stát je, že ta podmínka prostě projde, nebo neprojde (ať už isAborted obsahuje cokoliv). Ale nejsem v tomhle moc kovaný. Nevíte, může dojít i k nějaké neplatné operaci, nebo tak něco? _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
Dlaha

Založen: 30. 07. 2007 Příspěvky: 598 Bydliště: Olomouc
|
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 8. leden 2014, 11:20:00 Předmět: |
|
|
Díky. "Mělo by". Ale dá se na to spolehnout?
Co by se stalo, kdyby ta operace atomická nebyla? Pouze tiše přečtu z paměti nesmysl, nebo se zasignalizuje nějaká runtime chyba? Možná to moc řeším, ale jde mi o princip. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 8. leden 2014, 11:21:43 Předmět: |
|
|
na tohle IMHO vubec neni treba synchronizace skrz mutex, mutex se pouziva na mistech kde dva pristupuji k jedne promenne a oba zapisuji a musi znat korektni predchozi stav
tady je pouziti isAborted uplne v pohode
jinak jeste by slo uzit toto - http://msdn.microsoft.com/en-us/library/windows/desktop/ms684122(v=vs.85).aspx - ale porad to vidim jako kanon na vrabce |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 8. leden 2014, 11:26:11 Předmět: |
|
|
Bezva, tak to bude asi stačit, to rád slyším. Díky. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 8. leden 2014, 11:26:23 Předmět: |
|
|
Zápis není zdaleka atomický, ale když probíhá současně čtení i zápis, tak čtení vrátí buď true nebo false. Žádné runtime chyby ani omylem nehrozí. Takže pokud z jednoho vlákna čteč a v druhém zapisuješ a nevadí tí, že se třeba omylem provede maximálně jeden cyklus navíc, tak mutex nepotřebuješ. Mohlo by se to chovat neočekávaně jen kdybys zapisoval ze dvou vláken najednou. |
|
Návrat nahoru |
|
 |
LukeMak
Založen: 08. 02. 2013 Příspěvky: 16
|
Zaslal: 8. leden 2014, 11:36:52 Předmět: Re: Přerušení cyklu v threadu |
|
|
Presne tohle jsem kdysi resil taky - "bal" jsem se, aby to nedelalo neco neocekavaneho a potreboval jsem taky jen takovou primitivni synchronizaci. Nakonec jsem volatile int pouzil a vse fungovalo spravne a bez problemu a i kdyby se stalo, ze by se z pameti precetl nesmysl, tak to v mem pripade nevadilo, asi tak jako ve tvem. |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 8. leden 2014, 11:40:48 Předmět: |
|
|
Tak super. Tím je to vyřešené :-). Díky. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
|