Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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.

Předmět Autor Datum
Jen vystrel do tmy. Nepomuze ten pointer udelat volatile? To by melo zarucit viditelnost stejne hodn…
MaSo 25.03.2015 12:18
MaSo
Bohužel to nemá žádný efekt. Ať ty pointery dám volatile ve třídě, nebo volatile globální, žádná změ…
Niko Bellic 25.03.2015 13:31
Niko Bellic
Aha, tak to volatile funguje v C++ jinak než v Javě. nový
MaSo 25.03.2015 13:40
MaSo
Nevadí, díky za nasměrování. Definoval jsem ty pointery jako atomic a už to jede. atomic<int*> read… poslední
Niko Bellic 25.03.2015 14:02
Niko Bellic

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.

According to the C++11 ISO Standard, the volatile keyword is only meant for use for hardware access; do not use it for inter-thread communication. For inter-thread communication, the standard library provides std::atomic<T> templates.

http://en.wikipedia.org/wiki/Volatile_%28computer_ programming%29

Zpět do poradny Odpovědět na původní otázku Nahoru