2 Stimmen

Code-Blöcke und Thread-Priorität

Wenn ich Code in Blöcke einfüge, etwa so:

    {
      f1();
      f2();
    }

Garantiert es, dass diese beiden Funktionen nacheinander von der CPU aufgerufen werden, unabhängig davon, welche anderen Prozesse laufen?

Der Grund, warum ich frage, ist, weil f1, in meinem Fall, etwas mit dem Betriebssystem tut, dann f2 verlässt sich auf die das Betriebssystem in den gleichen Zustand, um richtig zu arbeiten.

Wenn nicht (was ich nicht glaube), gibt es dann irgendein C++-Konstrukt, mit dem ich so etwas machen kann?

Außerdem gebe ich einige Hintergrundinformationen darüber, was in meinem echten Code geschieht:

f1() ist eigentlich eine Funktion, die auf einem Win32-System ein Fenster der obersten Ebene erzeugt. f2() ist eine Funktion, die nach dem Fenster der obersten Ebene sucht (das nicht die Taskleiste ist). Also, meine Sorge ist, dass ich in ein Problem laufen könnte, wobei andere Top-Level-Fenster in der Zeit zwischen erstellt werden können, wenn f1 beendet und f2 noch nicht ausgeführt wurde, in diesem Fall f2 das falsche Fenster finden wird.

5voto

Nicol Bolas Punkte 409659

Garantiert es, dass diese beiden Funktionen nacheinander von der CPU aufgerufen werden, unabhängig davon, welche anderen Prozesse laufen?

Ja, wenn diese Funktionen Threads oder ähnliches erzeugen, sie können in unterschiedlicher Reihenfolge ablaufen. Der eigentliche Code für diese Funktionen wird jedoch der Reihe nach ausgeführt.

Wenn es um den Zugang zu etwas geht außerhalb Ihres Prozesses, das ist eine andere Sache. C und C++ haben als Sprachen kein Konzept für Gleichzeitigkeit und dergleichen (abgesehen von ein paar Sprachmerkmalen wie volatile ). Alles innerhalb eines Programms ist sequentiell, aber die Welt außerhalb Ihres Programms ist unbekannt und unerkennbar (ohne eine Bibliothek, die solche Haken bietet).

Wenn die betreffende Bibliothek keine Möglichkeit bietet, zu verhindern, dass ein anderer Prozess einen globalen Zustand berührt, den Ihr Code berührt hat, dann können Sie nicht sicher sein, dass der Zustand so bleibt, wie Sie ihn gesetzt haben.

3voto

f2 könnte laufen pas direkt nach f1 und f2 sollte daher pas sich darauf verlassen, dass das System in dem Zustand ist, den f1 ließ es drin. In der Tat sollte keiner der beiden auf einem Multi-Thread-System mit dem Status spielen, es sei denn, Sie haben die richtigen Sperren eingerichtet.

Es ist jedoch es garantiert, dass f1 zurückgekehrt sein wird, bevor f2 genannt wird.

1voto

K Mehta Punkte 10133

Es wird immer in dieser Reihenfolge ausgeführt, aber wenn Sie Threads haben, die Ihre zugrunde liegenden Variablen ändern, die f1 und f2 verwenden, müssen Sie sie mit Mutex-Sperren schützen

1voto

Shamim Hafiz - MSFT Punkte 20458

Wenn der Codeblock so ist, wie er ist, und kein externes Problem auftritt, können Sie sicher sein, dass f2() erst nach Beendigung von f1() aufgerufen wird.

1voto

Oleg Punkte 788

F2 wird nach f1 aufgerufen, aber dazwischen kann etwas passieren (es kann auch den Status des Betriebssystems ändern)

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