C++ Linux threads raspberry pi

Gandalf2210

Commodore
Registriert
Mai 2010
Beiträge
4.257
Hallo zusammen

Ich habe in visual Studio ein Programm geschrieben, welches mit vier threads läuft.
Nun möchte ich dieses auf meinem raspberry pi2 unter raspian ausführen.
Also die drei Dateien kopiert und mittels
Code:
g++ Datei1 Datei2 Datei3
kompiliert
nachdem ich alle compile Fehler behoben habe, nötige klassen eingebunden habe.. kam zur Laufzeit folgendes Problem

terminate called after throwing an instance of 'std::system_error'
what(): Enable multithreading to use std::thread: Operation not permitted

auch
Code:
g++-4.7 Samplefile.h Samplefile.cpp Filter.cpp -std=c++11
brachte keine Besserung


mit dem g++-4.9 kommt zwei mal die Fehlermeldung
undefined reference to `pthread_create'
die ich so nicht verwendet habe. Wird wohl automatisch bei erzeugen eines threads aufgerufen.

einer von euch eine Idee, was ich machen muss, um std:thread verwenden zu können?
 
Zuletzt bearbeitet:
Rufe g++ (möglichst aktuelle Version, C++11 ist afaik erst ab 4.8 vollständig implementiert) mal mit dem Parameter -pthread auf, sollte dann gehen.
 
wunderbar, vielen vielen dank, mit der g++-4.9 klappt es. Die compiler beschwerden sind weg, und er führt das Programm aus.
Nur leider geht jetzt nix anderes mehr und jede Variable als double zu speicher rächt sich jetzt bei großen arrays und nur einem gig RAM, aber dafür kann der compiler ja nix ;)
 
Der Fehler liegt darin dass du sie nicht ordnungsgemäß angebunden hast.
Wie sieht dein Quellcode aus?

Der Thread wird beim compilieren nicht aufgerufen/gefunden.

Wenn du im Code am anfang bei include stream oder so ähnlich~ eine (") stehen hast entferne diese.
Und ersetze sie durch ein (#) vor dem Befehl.

um es zu Kompilieren.

g++ -std=c++11 q.cpp -lpthread

Du hast die Anbindung vergessen mit anzugeben


Die Reihenfolge ist hier von Bedeutung beim neuen (g++)

undefined reference to `pthread_create'
Befehl wurde nicht definiert.

Das Ist ein Bug im GCC

und das der Workaround: (trifft auch auf 4.8.1 gcc)

-Wl,--no-as-needed

Für die Console g++:
g++ -c main.cpp -pthread -std=c++11 // Erstellt die Hauptdatei
g++ main.o -o main.out -pthread -std=c++11 // macht eine Verknüpfung zur Hauptdatei
 
Zuletzt bearbeitet:
Was macht denn dein Programm, dass du damit dauerhaft zwei (vier?) Kerne und ein Gig Ram auslastest? Sicher, dass du kein Memory Leak und/oder Spinlock hast? Aufwändige Mathematische Berechnungen würde ich auf dem Pi eh nicht laufen lassen.
 
Zuletzt bearbeitet:
es geht um ein selbst geschriebenes Audiobearbeitungs Programm, was hoch/tief/bandpass Operationen durchführen kann.
Dazu ist eine Signalfaltung notwendig, ziemlich viel Multiplizierne und addieren.
jedes Sample wird als double gespeichert, also bei einer 40 MB wav Datei sind das schonmal 160 MB RAM. Dann eine kopie davon erstellen, auf der man das ergebnis schreibt. Fehlt immer noch gut was an speicher, ka wo ich den alles brauche, ist bei 16 gig RAM im Desktop auch nicht weiter erforderlich gewesen.
Bei einem 4 Minuten Stereo Lied sind es 40 Mrd Multiplikationen und nochmal genau so viele Additionen, die der durchführen muss.
Mein Dektop schafft das in 10 sec, auf dem Raspberry habe bevor er fertig war die Geduld verloren^^
Aber aus RAM Gründen müsste ich da alles mal auf 32 bit float umstellen, sollte noch ausreichend genau sein, halber RAM verbrauch, und 32bit Variablen kommen einem 32 bit Prozessor sicher auch gelegener.
Hast natürlich vollkommen recht, dazu ist der raspberry eigentlich nicht geignet (und auch das Uni Cluster mit 64 Kernen ist langsamer).
Es war eine reine machbarkeitsstudie weil ich mein Programm einfach mal auf Linux testen wollte, und wie das unter Linux mit den threads ist. Abgesehen von notwendigen compiler Einstellungen zu Glück genau so wie unter Windows, c++11 sei dank.
 
moshimoshi schrieb:
Das Ist ein Bug im GCC

Ohne den restlichen Thread im Detail gelesen zu haben: Das ist KEIN Bug sondern es wurde schlichtweg die Arbeitsweise vom Linker geändert. Früher wurde immer versucht alles zu linken was angegeben wurde. Die neue, minimalistischere Methode ist für jedes angegebene object file zu checken, ob dieses zu diesem Zeitpunkt (aus der Sicht der Reihenfolge der Linkerargumente) bereits benötigt wird. Wenn nicht wird es verworfen. Das Linkerflag --no-as-needed sagt einfach dem Linker einfach nur, dass er sich gleich verhalten soll wie frühere Versionen, es repariert keinen Bug.
 
Gandalf2210 schrieb:
es geht um ein selbst geschriebenes Audiobearbeitungs Programm, was hoch/tief/bandpass Operationen durchführen kann.
Dazu ist eine Signalfaltung notwendig, ziemlich viel Multiplizierne und addieren.
jedes Sample wird als double gespeichert, also bei einer 40 MB wav Datei sind das schonmal 160 MB RAM. Dann eine kopie davon erstellen, auf der man das ergebnis schreibt. Fehlt immer noch gut was an speicher, ka wo ich den alles brauche, ist bei 16 gig RAM im Desktop auch nicht weiter erforderlich gewesen.
Bei einem 4 Minuten Stereo Lied sind es 40 Mrd Multiplikationen und nochmal genau so viele Additionen, die der durchführen muss.
Mein Dektop schafft das in 10 sec, auf dem Raspberry habe bevor er fertig war die Geduld verloren^^
Aber aus RAM Gründen müsste ich da alles mal auf 32 bit float umstellen, sollte noch ausreichend genau sein, halber RAM verbrauch, und 32bit Variablen kommen einem 32 bit Prozessor sicher auch gelegener.
Hast natürlich vollkommen recht, dazu ist der raspberry eigentlich nicht geignet (und auch das Uni Cluster mit 64 Kernen ist langsamer).
Es war eine reine machbarkeitsstudie weil ich mein Programm einfach mal auf Linux testen wollte, und wie das unter Linux mit den threads ist. Abgesehen von notwendigen compiler Einstellungen zu Glück genau so wie unter Windows, c++11 sei dank.

Ich weiss jetzt natuerlich nicht genau, was du da tust. Aber es klingt fuer mich irgendwie recht ineffizient. Du koenntest doch mit Buffern arbeiten, um nicht mehrere Kopien deiner Datei im RAM liegen haben zu muessen.
 
Zurück
Oben