2016-03-24 11 views
0

Ich versuche, ein Programm zu schreiben, das ständig in einer Schleife ausgeführt wird und nur einen Thread ausführen, wenn der vorherige Thread geschlossen wurde. Ich kann den Status des Threads außerhalb der ersten if-Anweisung nicht überprüfen, da status in der ersten if-Anweisung deklariert ist. Wenn ich den Status innerhalb der ersten Aussage überprüfe, werde ich komplett ausgesperrt. Wie kann ich etwas implementieren, um dies zu umgehen, ohne dass der Thread dem Hauptprogramm beitritt?Thread-Ausführung innerhalb der Schleife mit Schlössern

int script_lock = 1; //lock is open 
    while (true) { 

     if (script_lock == 1) { 
      script_lock = 0; //lock is closed 
      auto future = async (script, execute); //runs concurrently with main program 
      auto status = future.wait_for(chrono::milliseconds(0));  
     } 

     if (status == future_status::ready) { //status not declared in scope 
      script_lock = 1; //lock is open 
     } 

     //do extra stuff 
    } 
+0

Sie können nicht erklären, nur 'status' direkt nach dem' while'? – 4386427

Antwort

0

Dieser Code hat ein Problem: wenn script_lock-0 gleich wird und das erste Mal status == future_status::ready ausfällt, dann script_lock nie Wert ändern.

können Sie den Code vereinfachen, wie folgt:

bool finished = true; 
while (true) { 
    // Define future here 

    if (finished){ 
     future = async (script, execute); 
     finished = false; 
    } 

    if (future.wait_for(chrono::milliseconds(0)) == future_status::ready) 
      finished = true; 

    //do extra stuff 
} 
+0

'Fehler: fehlende Vorlagenargumente vor '.' Token if (future.wait_for (chrono :: Millisekunden (0)) == future_status :: ready)' –

+0

Ja, Sie müssen den vollen Typ für die Zukunft herausfinden (no 'auto', wie es vor dem Aufruf von' async' definiert wurde und fügt bei Bedarf passende Template-Argumente hinzu. – Claudio

Verwandte Themen