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).