J'ai une question concernant un mot-clé volatile pour lequel je n'arrive pas à trouver de réponse.Classes volatiles en C++
Dans mon application, j'ai une classe de données qui est partagée en tant que tampon d'état entre les threads, et j'ai besoin qu'il soit mis à jour régulièrement à partir de plusieurs threads.
classe ressemble à ceci:
class CBuffer
{
//Constructor, destructor, Critical section initialization/destruction
//...
volatile wstring m_strParam;
//...
void InterlockedParamSetter(const wstring &strIn);
wstring InterlockedParamGetter();
ParamSetter(const wstring &strIn);
wstring ParamGetter();
Lock();
Unlock();
}
void CBuffer::InterlockedParamSetter(const wstring &strIn)
{
Lock();
const_cast<wstring>(m_strParam) = strIn;
Unlock();
}
//... other f-ns
Mais le compilateur se plaint de la conversion const_cast. Il semble presque que j'utilise abusivement le mot clé volatile, mais en même temps, je ne peux pas laisser les params être mis en cache entre les appels, parce que si deux ou trois threads vont les assigner, quelque chose peut mal se passer.
Comment écrire des classes sécurisées thread/cache en C++?
P.S .: Jusqu'à présent, le verrouillage n'est pas le goulot d'étranglement, et les verrous sont assez simples, donc pour l'instant, la sérialisation et le verrouillage ne sont pas un problème du point de vue des performances. Bien sûr, s'il y a un meilleur algorithme, j'écouterai volontiers.
EDIT: Je suis toujours pas clair ...
Considérons cet exemple (inline + temps lien codegen);
void Thread1Func()
{
//Unrolled, inlined InterlockedParamSetter()
EnterCriticalSection(&cs);
WriteTo(CBuffer::m_strParam);//write to buffer, wstring not volatile, cache it
LeavCriticalSection(&cs);
//Unroll end
//DoSomethingElse
//!!!!Thread 2 does InterlockedParamSetter
//which causes wstring::reserve and invalidates old pointers!!!!
//Unrolled, inlined InterlockedParamSetter()
EnterCriticalSection(&cs);
WriteTo(CBuffer::m_strParam);//oh, good, we have a pointer to old buffer
//cached in one of the registers, write to it -> access violation
LeavCriticalSection(&cs);
//Unroll end
}
Avez-vous lu l'un des autres messages marqués "volatile"? Ce que ce mot-clé fait/n'a pas été discuté longuement ici. –
J'ai essayé de chercher, mais je n'ai pas trouvé de réponse définitive à propos des objets et de leurs optimisations en l'absence de génération de code temporel volatile et inline + link. – Coder
Réponse: http://stackoverflow.com/questions/3612505/is-volatile-needed-in-this-multi-threaded-c-code/3612551#3612551 – rwong