www.mikrocontroller.net

Forum: PC-Programmierung Pthread - Strange Problem


Autor: Michael H. (overthere)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Super-Strange-Problem mit Ptreads. (Muss aber dazu sagen, 
ich habe damit keine Erfahrungen). Ich habe ein Dual-Core-Prozessor und 
habe ein Optimierungsprogramm geschrieben. Das Programm macht nichts 
weiter als ein bissel Speicher anfordern und etwas rechnen.
Das ganze Programm ist so strukturiert, dass es 2 "Rechenesel" gibt, 
diese sind vollkommen gleich aufgebaut, bisauf dass sie etwas vorschoben 
arbeiten. Lasse ich die Dinger hintereinander laufen, gibt es keine 
Probleme, lasse ich die Threads gemeinsam laufen gibt es irgendwelche 
Segmentation-Faults. Aber erst nach wenigen Sekunden...
// Das hier sind globale Variablen
  GList* global_list1=NULL;
  GList* global_list2=NULL;
  rp_t*  global_regelparameter1=NULL;
  rp_t*  global_regelparameter2=NULL;


void *optimisation_thread1(void* arg){
  printf("Thread1 started\n");
  rp_t* regelparameter1=global_regelparameter1;
  double ianteil, danteil;
  GList* listopti1=NULL;
  pwm_t* pwmval1=init_pwm_struct();  
  int target1=adc_convert(regelparameter1,0.7);
  for(ianteil=0;ianteil<2;ianteil=ianteil+0.02){
    for(danteil=0;danteil<2;danteil=danteil+0.01){
      bewfac_t* bf=optimisation_init1(ianteil,danteil,target1);
      reset_pwm_val(pwmval1);
      optimisation_simulate(regelparameter1,pwmval1,bf);
      //optimisation_print_error(bf);
      listopti1=g_list_prepend (listopti1,bf);
      //optimisation_print_error(bf);
    }
  }
  printf("Task1finished\n");
  global_list1=listopti1;
  return 0;
}
void *optimisation_thread2(void* arg){
  printf("Thread2 started\n");
  rp_t* regelparameter2=global_regelparameter2;
  double ianteil, danteil;
  GList* listopti2=NULL;
  pwm_t* pwmval2=init_pwm_struct();
  int target2=adc_convert(regelparameter2,0.7);
  for(ianteil=0.01;ianteil<2;ianteil=ianteil+0.02){
    for(danteil=0;danteil<2;danteil=danteil+0.01){
      bewfac_t* bf=optimisation_init2(ianteil,danteil,target2);
      reset_pwm_val(pwmval2);
      optimisation_simulate(regelparameter2,pwmval2,bf);
      //optimisation_print_error(bf);
      listopti2=g_list_prepend (listopti2,bf);
      //optimisation_print_error(bf);
    }
  }
  printf("Task2finished\n");
  global_list2=listopti2;
  return 0;
  
}
Habt ihr eine Idee, woran es liegen kann?

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
init_pwm_struct()
adc_convert()
optimisation_simulate()...

nicht thread-safe?
irgendwo in ihnen finden static oder globale Zugriffe statt?

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> irgendwelche Segmentation-Faults.

Soso, irgendwelche... Ich gehe mal soweit zu behaupten, dass ein 
Backtrace von irgendwelchen Segfaults in 90% aller Fälle bereits reicht, 
die Ursache zu erkennen bzw. sehr stark einzukreisen.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwei Möglichkeiten:
1. GDB verwenden um den Fehler zu finden
2. Thread-Gewurstel sein lassen, und stattdessen OpenMP verwenden.

Autor: Michael H. (overthere)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, gerade mal gdb angeschmissen. Scheinbar ist die GLib nicht 
thread-save, mein Sach jedenfalls ist es! (Danke für den Tipp mit dem 
Backtrace)
=======
[Thread debugging using libthread_db enabled]
[New Thread 0xb7d48b70 (LWP 1313)]
Thread1 started
[New Thread 0xb7548b70 (LWP 1314)]
Thread2 started

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7548b70 (LWP 1314)]
0xb7f1a599 in ?? () from /usr/lib/libglib-2.0.so.0
(gdb) backtrace
#0  0xb7f1a599 in ?? () from /usr/lib/libglib-2.0.so.0
#1  0xb7f1b583 in g_slice_alloc () from /usr/lib/libglib-2.0.so.0
#2  0xb7efafe6 in g_list_prepend () from /usr/lib/libglib-2.0.so.0
#3  0x08049ad5 in optimisation_thread2 ()
#4  0xb7eb3830 in start_thread () from /lib/libpthread.so.0
#5  0xb7e2a15e in clone () from /lib/libc.so.6
===
Konkret dürfte es dann an diesem scheitern:
listopti2=g_list_prepend (listopti2,bf);
Ich habe das jetzt mehrmals durchgefürt und es liegt immer daran. Da hat 
mich die G-Lib schwer enttäuscht. Ich frage mal direkt bei den 
G-Lib-Menschen nach. Wenn ihr ein paar Tipps für mich habt, nur raus 
damit...

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael H. schrieb:
> Da hat mich die G-Lib schwer enttäuscht
Goldene Regel: Wenn es nicht explizit dabeisteht ist eine Funktion nicht 
Threadsave, nur um weiteren Enttäuschungen vorzubeugen ;)

Autor: Michael H. (overthere)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt OpenMP genommen, das funktioniert super. Vielen Dank für 
den Tipp... Jetzt fehlen nurnoch ein paar Prozessorkerne mehr, die man 
haben sollte... ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.