Nein. Der Aufrufer muss eine Sperre erfassen, da er anstelle einer Kopie einen Verweis auf die Daten erhält. Sie können nicht irgendwie auf einen int
Thread-Safe für alle Code verweisen, der es verwendet.
Wenn Sie eine threadsichere Operation für die Daten benötigen und nicht möchten, dass der Aufrufer verantwortlich ist, haben Sie zwei Möglichkeiten: a) Fügen Sie diese Operation in der API Ihrer Klasse hinzu oder b) implementieren Sie einen Wrappertyp um die int
Referenz.
Ein Wrapper kann kompliziert zu implementieren sein, da Sie sich nun um jeden möglichen Fall kümmern müssen. Ist es kopierbar? Beweglich? Beide auf thread-sichere Weise?
Also würde ich opt für das Hinzufügen der Operation als API. Wie:
class BlockingVector{
// ...
void setVal(size_t index, int newVal)
{
std::lock_guard<std::mutex> lock(m_mutex);
m_vector[index] = newVal;
}
// Change: return copy, not reference.
int operator [](size_t p_index) const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_vector[p_index];
}
};
Dies kann jedoch eine verwirrende API sein. So würde ich vorschlagen, nicht eine normale Funktion Überlastung operator[]
statt:
int getVal(size_t p_index) const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_vector[p_index];
}
Beachten Sie, dass der Lage sein, den Mutex in einer const
Funktion zu sperren, müssen Sie es wandelbar machen:
class BlockingVector{
// ...
mutable std::mutex m_mutex;
Sie lesen sollte mutexes für weitere Informationen über und const
Funktionen:
Should mutexes be mutable?
Was möchten Sie erreichen? – MFisherKDX
Warum sollte es falsch sein? Was sind die Probleme mit dem Code? Wie benutzt man es? Bitte [lesen Sie, wie Sie gute Fragen stellen können] (http://stackoverflow.com/help/how-to-ask) und erfahren Sie, wie Sie ein [minimales, ** vollständiges ** und verifizierbares Beispiel] erstellen können (http: //stackoverflow.com/help/mcve). –
Was lässt dich denken, dass das "total falsch" ist? – Yuushi