Cette question concerne l'utilisation des méthodes getter d'un objet singleton dans les threads de travail. Voici un code pseudo premier:Singleton getInstance dans les méthodes de travail de thread
// Singleton class which contains data
class MyData
{
static MyData* sMyData ;
int mData1[1024];
int mData2[1024];
int mData3[1024];
MyData* getInstance()
{
// sMyData is created in the very beginning.
return sMyData ;
}
void getValues(int idx, int& data1,int& data2,int& data3)
{
data1 = mData1[idx];
data2 = mData2[idx];
data3 = mData3[idx];
}
int* getData1()
{
return &mData1[0];
}
}
class MyThread
{
void workerMethod()
{
MyData* md = MyData::getInstance();
int d1,d2,d3;
md->getValue(12, d1,d2,d3);
int* data1 = md->getData1();
d1 = data1[34];
}
}
Maintenant que vous voyez que j'ai des méthodes de lecture (tout en lecture seule), MyData :: getInstance(), MyData :: getValue() et MyData :: getData1() . La première question est de savoir comment ces méthodes sont thread-safe? Comme ils sont souvent appelés méthodes, la protection de ces méthodes avec mutex est quelque chose que j'essaie d'éviter.
La deuxième question est: quelle est la manière suggérée de lire des données à partir de sources centrales dans une application multi-thread, en particulier dans les méthodes de travail.
Merci!
Paul
Vous n'avez pas besoin de verrouiller juste à cause de l'esprit. Vous avez seulement besoin d'un verrou si l'écriture est non atomique. Une écriture entière est atomique. Si quelque chose doit écrire 2 entiers pour maintenir un état cohérent, alors vous aurez besoin d'un verrou pour vous assurer que les deux sont mis à jour avant que quiconque ne lise l'objet. –
Il n'est pas garanti que l'affectation Int soit atomique ... – user23167