Frage

Ich bin mir nicht sicher, ob ich richtig verstehe. TryEnterCriticalSection wird nur einmal genannt, es ist nicht wie ein Stock wie EnterCriticalSection? ZB, wenn ich so etwas schreibe

if(TryEnterCriticalSection (&cs))
{
//do something that must be synh
LeaveCriticalSection(&cs);
}
else
{
//do other job
}
//go on

und wenn TryEnterCriticalSection Gibt falsch das Teil zurück do something that must be synh wird niemals getan werden, und do other job Teil wird erzählt und dann go on?

War es hilfreich?

Lösung

Du hast richtig geraten. TryEnterCriticalSection() wird einmal aufgerufen und versucht, den kritischen Abschnitt nur einmal einzugeben. Wenn der kritische Abschnitt gesperrt ist, gibt er nach dem Scheck false zurück.

Wenn eine Funktion im Allgemeinen einen Booleschen oder einen int zurückgibt, verhält sich die If/sonst -Klauseln wie folgt:

if (function()) //function() is called once here, return result is checked
{
  //executed if function() returned true or non-zero
}
else
{
  //executed if function() returned false or zero
}
//executed whatever happens

Andere Tipps

TryEnterCriticalSection() macht Folgendes:

  • versucht, einen kritischen Abschnitt einzugeben
  • Wenn dieser Abschnitt derzeit von einem anderen Thread gepackt wird, wird der Abschnitt nicht eingegeben und die Funktion kehrt null zurück, andernfalls
  • Der Abschnitt wird eingegeben und die Funktion gibt ungleich Null zurück

Wie auch immer, die Funktion blockiert nie. Vergleichen Sie es mit EnterCriticalSection() Das fällt durch, wenn kein anderer Thread über den kritischen Abschnitt eingegeben wird und blockiert, wenn ein solcher Thread vorliegt.

Das Ergebnis Ihres Codes hängt also davon ab, ob der kritische Abschnitt zu dem Moment, in dem die Funktion aufgerufen wird, von einem anderen Thread eingegeben wird. Vergessen Sie nicht anzurufen LeaveCriticalSection() für jedes Mal, wenn TryEnterCriticalSection() Gibt ungleich Null zurück (Erfolg).

Also ja, Ihr Code ist mit richtigen Annahmen geschrieben.

Ja, Ihr Code ist korrekt.

Sehen Sie mehr auf Msdn.

Wenn Ihr kritischer Abschnitt zu klein ist, müssen Sie dies versuchen TryEnterCriticalSection In einer Schleife, da es dann weniger Taktzyklen erfasst, um den kritischen Abschnitt zu betreten und diesen kritischen Abschnitt zu verlassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top