mit So eine Klasse wie:Wäre eine solche Klasse nur einmal durch mehrere Threads lesbar?
class mySafeData
{
public:
mySafeData() : myData(0), changed(false)
{
}
void Set(int i)
{
boost::mutex::scoped_lock lock(myMutex);
myData = i; // set the data
changed = true; // mark as changed
myCondvar.notify_one(); // notify so a reader can process it
}
void Get(int& i)
{
boost::mutex::scoped_lock lock(myMutex);
while(!changed)
{
myCondvar.wait(lock);
}
i = myData;
changed = false; // mark as read
myCondvar.notify_one(); // notify so the writer can write if necessary
}
private:
int myData;
boost::mutex myMutex;
boost::condition_variable myCondvar;
bool changed;
};
Und ein Thread in Schleife Set
aufrufen. Und 3 oder mehr Threads Aufruf Get
wie alle Threads aufrufen Get
machen, um tatsächlich Daten zu erhalten (jeder Thread soll Get
Daten nur einmal Set
wurde aufgerufen) (es scheint nur der erste "Leser" wer ruft Get
ruft Daten)?
Update wird dies tun ?:
class mySafeData
{
public:
mySafeData() : myData(0)
{
}
void Set(int i)
{
boost::mutex::scoped_lock lock(myMutex);
myData = i; // set the data
}
void Get(int& i)
{
boost::mutex::scoped_lock lock(myMutex);
i = myData;
}
private:
int myData;
boost::mutex myMutex;
};
Ich habe den Post aktualisiert - meinst du, dass das Update, das ich gepostet habe, funktioniert? Mein Hauptpunkt ist, dass die Leser nicht mehr als einmal auf einem Set lesen ... – Rella
Ich könnte mir vorstellen, dass das funktionieren würde (obwohl Sie wahrscheinlich 'myData' als' volatile' deklarieren müssen, um zu verhindern, dass der Compiler unsichere Optimierungen durchführt. Ich bin es nicht sicher, was Sie mit "liest nicht mehr als einmal auf jeden Satz zu lesen." Sicher wollen Sie nur 'get()', um sicher den neuesten Wert jedes Mal, wenn ein Reader Thread ruft es zurück? –
Ich habe versucht, hier http zu erklären: //stackoverflow.com/questions/4713782/boost-mutex-order – Rella