2016-10-10 4 views
0

Dies ist ein minimales Beispiel basierend auf einem Code-Verbindung, die ich übergeben wurde:Verwendung und ein std :: Thread-Objekts aus verschiedenen Threads

// Example program 
#include <iostream> 
#include <string> 
#include <thread> 


int main() 
{ 
    std::cout << "Start main\n"; 
    int i = 0; 
    auto some_thread = std::thread([&]() { 
    std::cout << "Start some thread\n"; 
     while(i++ < 100) { 
     std::cout << i << std::endl; 
     std::this_thread::sleep_for(std::chrono::milliseconds(1000)); 
     } 
    }); 
    std::this_thread::sleep_for(std::chrono::milliseconds(1000)); 

    auto some_thread2 = std::thread([&]() { 
     std::cout << "Start thread 2\n"; 
     if (some_thread.joinable()) { 
     std::cout << "Thread 2 will join\n"; 
     some_thread.join(); 
     std::cout << "Thread 2 ended\n"; 
     } else { 
     std::cout << "Thread 2 ended but didn't join\n"; 
     } 
    }); 
    std::this_thread::sleep_for(std::chrono::milliseconds(1000)); 
    if (some_thread.joinable()) { 
    std::cout << "Main will join\n"; 
    some_thread.join(); 
    std::cout << "Main ended\n"; 
    return 0; 
    } else { 
    std::cout << "Main ended but didn't join\n"; 
    return 1; 
    } 
} 

Kurz gesagt, das volle Programm (wie in diesem Beispiel) Zugang zu einigen std::thread Objekt aus verschiedenen Threads und versucht, join und detach zu ihm.

Ich weiß, es ist ein schlechtes Design, und wenn Sie versuchen, einen Thread zweimal beizutreten, wird es abstürzen, weil nach dem ersten beendet wird, dann ist kein Thread damit verbunden. Aber das ist nicht der Fall.

In diesem Beispiel stürzt es ab, bevor der Thread endet und mit einem Abort trap:6. Es druckt nur ein paar Zahlen und stürzt dann ab (der Thread beendet seine Ausführung nicht).

Der Code ist nicht meins und ich will kein Redesign. Ich will nur verstehen, warum es zusammenbricht.

Eine letzte Notiz, der ursprüngliche Code funktionierte irgendwie mit Semaphoren und so (mit einigen zufälligen Abstürzen, obwohl).

Antwort

0

I know ... that if you try to join a thread twice it will crash because after the first one finishes, then there's no thread associated with it. But this is not the case.

Im Gegenteil, genau das passiert hier. some_thread2 Anrufe some_thread.join() und während es auf some_thread wartet, um zu beenden, ruft der Hauptfaden auch some_thread.join() auf. some_thread ist immer noch aktiv und wurde zum Zeitpunkt der beiden Prüfungen nicht verbunden. Daher gibt joinable() in beiden Fällen "true" zurück.

Eine Möglichkeit, den Absturz zu vermeiden, wäre some_thread2.join(); hinzufügen, bevor Sie some_thread.joinable() im Hauptthread überprüfen (aber wenn Sie das tun, gibt es keine Notwendigkeit für den Hauptthread some_thread zu verbinden).

In jedem Fall ist nicht klar, warum Sie den Thread von zwei verschiedenen Threads join wollen, so ist es schwierig, eine bessere Lösung vorzuschlagen.

0

Die std :: -Thread-Bibliothek wird normalerweise auf pthreads in einer Umgebung implementiert, die pthreads unterstützt (zum Beispiel: libstdC++).

von pthread_join Linux Zitiert documentation:

If multiple threads simultaneously try to join with the same thread, the results are undefined.

Es erwähnt auch, dass es den folgenden Fehler zurückgibt:

EINVAL Another thread is already waiting to join with this thread.

Verwandte Themen