6 Stimmen

Mehrere Threads - muss ich beim Lesen von Daten sperren?

Sehen Sie sich diesen Code an:

int data=5;

void Thread1()
{
    if(data==5)
    {
       //nothing
    }
}

void Thread2()
{
    if(data==2)
    {
       //nothing
    }
}

Muss ich in diesem Fall EnterCriticalSection/MutexLock vor if(data==..) verwenden?

7voto

Martin York Punkte 245363

Wenn Sie die Daten nur lesen, sind keine Sperren erforderlich.

Wenn Sie die Daten schreiben UND Sie sich um die Reihenfolge der gelesenen Daten kümmern, dann müssen Sie CS verwenden, um sicherzustellen, dass die Reihenfolge korrekt ist. (Hinweis: Wenn das Objekt einen komplexeren Zustand hat, der nicht in einer atomaren Operation aktualisiert wird, ist die Reihenfolge der Lese-/Schreibvorgänge möglicherweise wichtiger).

1voto

Wenn die Daten nie geändert werden, dann ist das bei den meisten Architekturen nicht der Fall. Aber wenn sich die Daten nie ändern, ist der Code sinnlos.

1voto

Ben Voigt Punkte 268424

Wenn die Daten von einem anderen Thread geändert werden, benötigen Sie beim Lesen einen Speicherzaun, um die Konsistenz zu gewährleisten. Eine Sperre ist eine Möglichkeit, einen Memory Fence zu erreichen, aber nicht unbedingt die optimale. Wenn Sie jedoch nicht feststellen (durch Messungen!), dass das Sperren Ihr Programm erheblich verlangsamt, lohnt es sich wahrscheinlich nicht, sich über Alternativen Gedanken zu machen.

0voto

Jack Punkte 128223

Wenn Ihr Beispiel bereits vollständig sein soll, dann keine müssen Sie keinen kritischen Abschnitt sperren oder verwalten, da Sie nichts ändern.

Aber du zum Beispiel, so wie es ist, ist es einfach sinnlos.

Sie müssen die Gleichzeitigkeit nicht behandeln, wenn es Threads gibt, die nur einfache Daten lesen (bei iterierbaren Datenstrukturen ist das anders), aber dies ist nur nützlich, wenn Sie statische Daten haben, die nicht geändert werden müssen. Sobald man nur einen Writer hinzufügt, muss man sicherstellen, dass niemand liest, wenn er schreibt, aber jeder wird immer noch in der Lage sein, gleichzeitig mit anderen Lesern zu lesen, wenn kein Writer seine Arbeit macht.

0voto

Kiril Punkte 38504

Sie müssen nicht sperren, wenn Sie den gemeinsamen Speicher nicht ändern, aber Ihr Beispiel wäre ziemlich nutzlos, da Sie initialisieren data Sie überprüfen den Wert, ändern ihn aber nicht... der zweite Thread wird völlig nutzlos sein. Ändern Sie data Variable irgendwo?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X