2016-06-01 7 views
0

Ich habe Build-Programm für unten Programm mit PPC-Toolchain.Crash für Thread-Erstellung in PPC

Werkzeugkette Details: powerpc-WRS-linux-gnu-g ++ (Wind River Linux Sourcery G ++ 4.4a-341) 4.4.1

Wir haben während der Kompilierung enthalten -pthread und -lpthread für die Verknüpfung. Wir benutzen auch -lrt und -ldl Flags.

#include <string> 
#include <iostream> 
#include <thread> 

using namespace std; 

// The function we want to execute on the new thread. 
void task1(string msg) 
{ 
    cout << "task1 says: " << msg; 
} 

int main() 
{ 
    // Constructs the new thread and runs it. Does not block execution. 
    thread t1(task1, "Hello"); 

    // Makes the main thread wait for the new thread to finish execution 
    // therefore blocks its own execution. 
    t1.join(); 
} 

Während der Ausführung des Programms bin immer den Absturz, wie unten

Program received signal SIGILL, Illegal instruction. 
0x10000e30 in __gnu_cxx::__exchange_and_add(int volatile*, int)() 
(gdb) bt 
#0 0x10000e30 in __gnu_cxx::__exchange_and_add(int volatile*, int)() 
#1 0x10000f14 in __gnu_cxx::__exchange_and_add_dispatch(int*, int)() 
#2 0x10001960 in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release()() 
#3 0x100016ac in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count()() 
#4 0x100013ac in std::__shared_ptr<std::thread::_Impl_base, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr()() 
#5 0x100013e8 in std::shared_ptr<std::thread::_Impl_base>::~shared_ptr()() 
#6 0x100014c0 in std::thread::thread<void (&)(std::basic_string<char, std::char_traits<char>, std::allocator<char> >), char const (&) [6]>(void (&&&)(std::basic_string<char, std::char_traits<char>, std::allocator<char> >), char const (&&&) [6])() 
#7 0x10000fd4 in main() 

Können Sie bitte vorschlagen sind wir etwas in den Flaggen für Build fehlt.

Antwort

0

Es gibt einen offensichtlichen Fehler im Code

cout << "task1 says: " << msg; 

hier cout (Strom) wird gemeinsam genutzte Ressource, sollten Sie den Zugriff darauf synchronisieren.

+0

Wir versuchten von cout ohne msg und immer noch den gleichen Fehler. Es scheint, das ist nicht das eigentliche Problem. – rajeshkb

+0

Können Sie versuchen, Ihre Datei wie folgt zu kompilieren: g ++ -std = C++ 11 -Pthread -o Haupt main.cpp, wobei main.cpp Quellenname ist –

+0

Wir haben keine C++ 11-Unterstützung. Wir haben festgestellt, dass ein Problem mit dem Threading in PPC auftaucht. Wir haben mit Boost aktualisiert und es ist jetzt in Ordnung. Vielen Dank. – rajeshkb

0

Der Haupt Hinweis ist hier:

Program received signal SIGILL, Illegal instruction. 

Es sieht aus wie die Standard-Codegenerierungseinstellungen Ihres Compiler Anweisungen ausgeben, die von Ihrer CPU nicht unterstützt werden. Wenn Sie die tatsächliche fehlerhafte Anweisung von Gdb drucken, können Sie weitere Details zu dem Problem erhalten. Versuchen Sie:

(gdb) x /i $pc 

Um die genaue Anweisung zu sehen, die die SIGILL verursacht.

Da die illegale Anweisung in __exchange_and_add ist, ist es wahrscheinlich, dass dies eine der atomaren Speicheranweisungen sein wird.

Um dies zu beheben, werden Sie wahrscheinlich Ihrem Compiler mitteilen wollen, für welche CPU er Anweisungen generieren soll. Sie können dies mit dem -mcpu= Argument tun. Wenn Sie einen ungültigen CPU-Spezifizierer angeben, druckt gcc die verfügbaren CPU-Typen:

$ powerpc64le-linux-gnu-gcc -mcpu=? 
powerpc64le-linux-gnu-gcc: error: unrecognized argument in option ‘-mcpu=?’ 
powerpc64le-linux-gnu-gcc: note: valid arguments to ‘-mcpu=’ are: 401 403 405 405fp 440 440fp 464 464fp 476 476fp 505 601 602 603 603e 604 604e 620 630 740 7400 7450 750 801 821 823 8540 8548 860 970 G3 G4 G5 a2 cell e300c2 e300c3 e500mc e500mc64 e5500 e6500 ec603e native power3 power4 power5 power5+ power6 power6x power7 power8 power9 powerpc powerpc64 powerpc64le rs64 titan 
powerpc64le-linux-gnu-gcc: fatal error: no input files