

C++ přístup k třídě z více vláken
Zdravím. Mám instanci třídy a v jedné metodě vytvářím nové vlákno. Toto vlákno zavolá jinou metodu z této třídy a pracuje samostatně. Obě vlákna čtou/zapisují do třídních proměnných. Jak druhé vlákno dokončí činnost, spojí se s prvním vláknem, které ho vytvořilo pomocí join(). Obě vlákna přistupují k alokovanému poli int, jeho pointer je třídní proměnná. Obě vlákna mají ještě svůj pointer na toto pole, na začátku jsou oba inicializovány na začátek pole a tyto pointery jsou rovněž ve třídě. Protože je jedno vlákno pomalejší, než druhé, využívá se jednoduché synchronizace. První vlákno postupně vkládá hodnoty do pole, druhé je odebírá. Porovnávají se pointery ve smyčce while a dokud je pointer pro čtení větší nebo roven pointeru pro zápis, tak to tam cyklí. Problém je, že to z té smyčky nevyskočí nikdy. Logicky by mělo. První vlákno vkládá hodnoty a zvyšuje pointer pro zápis. V určitém okamžiku bude hodnota pointeru pro zápis větší, než hodnota pointeru pro čtení a smyčka by se měla ukončit. Pointery jsem zkusil dát i úplně globální mimo třídu, ale stejný problém. Jako by se změna pointeru v druhém vlákně vůbec neprojevila v prvním. Do pole jde jinak zapisovat i číst z obou vláken. Pokud ty čekací cykly zakomentuju tak to funguje, ale nekorektně, protože chybí ta synchronizace.
P.S. žádné semafory ani kritické sekce tam nepoužívám, protože operace s integery jsou atomické, takže výlučný přístup není potřeba (rada MM..)
Díky za případnou radu.
Jen vystrel do tmy. Nepomuze ten pointer udelat volatile? To by melo zarucit viditelnost stejne hodnoty napric vlakny. Podle googleni to C++ umi. Ale nevim jestli to pomuze, jsem Javista....
Bohužel to nemá žádný efekt. Ať ty pointery dám volatile ve třídě, nebo volatile globální, žádná změna.
Ale něco jsem našel.
http://en.wikipedia.org/wiki/Volatile_%28computer_ programming%29
Aha, tak to volatile funguje v C++ jinak než v Javě.
Nevadí, díky za nasměrování. Definoval jsem ty pointery jako atomic a už to jede.
Vyřešeno.