Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Segmentation fault mit POSIX-Threads + Die Zweite

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 02. Mai 2005 10:42   Titel: Segmentation fault mit POSIX-Threads + Die Zweite

Ich habe ein kleines Problem mit POSIX-Threads:

Code:
/* max_threads.c
 * testet, wie viele threads ein prozess erzeugen kann.
 */

#include <stdio.h>
#include <pthread.h>

void *do_nothing(void *arg){
        while(1)
                ;
}

int main(){
        int i=0;
        while( pthread_create(NULL, NULL, do_nothing, NULL) )
                i++;

        printf("Das Programm konnte %d threads erzeugen.", i);
        pthread_exit(NULL);
}


Code:
$ gcc -pthread -Wall -ggdb max_threads.c 
$ ./a.out
segmentation fault


Warum der segfault?

Der gdb sagt dazu:

Code:
GNU gdb 6.0
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) run
Starting program: /home/maik/programming/c/simplescan/a.out
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
[Thread debugging using libthread_db enabled]
[New Thread 16384 (LWP 7863)]
[New Thread 32769 (LWP 7866)]
[New Thread 16386 (LWP 7867)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 16384 (LWP 7863)]
0x40037394 in pthread_create@@GLIBC_2.1 () from /lib/libpthread.so.0


Statisch gelinkt sieht das so aus:
Code:
$ gcc -static -pthread -Wall -ggdb max_threads.c
$ ./a.out
Segmentation fault
$ gdb a.out
GNU gdb 6.0
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) run
Starting program: /home/maik/programming/c/simplescan/a.out

Program received signal SIG32, Real-time event 32.
0x0804ab0f in __pthread_sigsuspend ()
(gdb)


Zuletzt bearbeitet von Lateralus am 06. Mai 2005 18:39, insgesamt 2-mal bearbeitet
 
Benutzer-Profile anzeigen Private Nachricht senden

hjb
Pro-Linux


Anmeldungsdatum: 15.08.1999
Beiträge: 3236
Wohnort: Bruchsal

BeitragVerfasst am: 02. Mai 2005 11:28   Titel:

Hi!

Ich schätze mal, daß das erste Argument nicht NULL sein darf, da darin ein Thread-Handle zurückgegeben wird. Außerdem liefert die Funktion im Erfolgsfall 0, du mußt also ein ! vor die Funktion setzen.

Gruß,
hjb
_________________
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger

Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 02. Mai 2005 15:03   Titel:

@hjb: Vielen Dank.

Das hier tut den Job. Ich habe noch das aktive Warten in passives geformt.

Code:
/* max_threads.c
 * testet, wie viele threads ein prozess erzeugen kann.
 */

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

#define TIME_TO_SLEEP 600

void *do_nothing(void *arg){
        while(1)
                sleep(TIME_TO_SLEEP);
}

int main(){
        pthread_t t;
        int i=0;
        while( ! pthread_create(&t, NULL, do_nothing, NULL) )
                i++;

        printf("Das Programm konnte %d Threads erzeugen.\n", i);
        return 0;
}

 
Benutzer-Profile anzeigen Private Nachricht senden

prospero_0
Gast





BeitragVerfasst am: 03. Mai 2005 9:30   Titel:

das 1. argument darf nicht NULL sein, sondern ein pointer auf ein pthread_t.

siehe auch:
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

gruss prospero
 

Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 06. Mai 2005 18:42   Titel:

OK, zweites Problem:

Ich habe ein Programm, das so aussieht:

Code:
#include <stdio.h>
#include <pthread.h>

#define THREAD_ANZ 3

struct xyz{
   pthread_t *a_threads;
   pthread_t *b_threads;
};

void *func_b(void *arg){
   int i;
   struct xyz *my_xyz = (struct xyz *) arg;

   pthread_t myself = pthread_self();

   for(i=0; i < THREAD_ANZ; i++){
      if( pthread_equal(myself, my_xyz->b_threads[i]) )
         fprintf(stderr, "Ich bin Nummer %d in b_threads", i);
   }

   pthread_exit(NULL);
}

void *func_a(void *arg){
   int i;
   struct xyz *my_xyz = (struct xyz *) arg;

   for(i=0; i < THREAD_ANZ; i++)
      pthread_create(&my_xyz->b_threads[i], NULL, func_b, (void *) &my_xyz);

   pthread_exit(NULL);
}

int main(){
   int i;

   struct xyz my_xyz;

   pthread_t threads_a[THREAD_ANZ];
   pthread_t threads_b[THREAD_ANZ];

   my_xyz.a_threads = threads_a;
   my_xyz.b_threads = threads_b;

   for(i=0; i < THREAD_ANZ; i++)
      pthread_create(&my_xyz.a_threads[i], NULL, func_a, (void *) &my_xyz);

   while(1)
      ;

   return 0;
}


Nach dem Kompilieren bekomme ich beim ausführen einen Segfault:

Code:
$ gdb a.out
GNU gdb 6.0
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) run
Starting program: a.out
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
[Thread debugging using libthread_db enabled]
[New Thread 16384 (LWP 17285)]
[New Thread 32769 (LWP 17288)]
[New Thread 16386 (LWP 17289)]
[New Thread 32771 (LWP 17290)]
[New Thread 49156 (LWP 17291)]
[New Thread 65541 (LWP 17292)]
[New Thread 81926 (LWP 17293)]
[New Thread 98311 (LWP 17294)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 65541 (LWP 17292)]
0x08048537 in func_b (arg=0xbf7ffac4) at pthread_segfault.c:18
18                      if( pthread_equal(myself, my_xyz->b_threads[i]) )



Warum passiert das?
 
Benutzer-Profile anzeigen Private Nachricht senden

hjb
Pro-Linux


Anmeldungsdatum: 15.08.1999
Beiträge: 3236
Wohnort: Bruchsal

BeitragVerfasst am: 06. Mai 2005 22:02   Titel:

Hi!

Ich habe dein Programm kurz durch den Debugger gequetscht, aber ich sehe zunächst die Ursache auch nicht.

Wenn ich das recht sehe, erzeugst du zuerst 3 Threads, die func_a ausführen. Jeder von diesen erzeugt 3 Threads, die func_b ausführen. Diese teilen sich aber die 3 Thread-Handles in b_threads. Ob das den Crash verursacht, weiß ich nicht, aber es wäre möglich.

Gruß,
hjb
_________________
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger

squeez



Anmeldungsdatum: 24.06.2004
Beiträge: 9
Wohnort: CH

BeitragVerfasst am: 06. Mai 2005 22:05   Titel:

tach

Der Segmentation Fault wird hier ausgeloest:
Zitat:

0x08048537 in func_b (arg=0xbf7ffac4) at pthread_segfault.c:18

func_a() Zeile:
Code:

pthread_create(&my_xyz->b_threads[i], NULL, func_b, (void *)&my_xyz);

nach
Code:

pthread_create(&my_xyz->b_threads[i], NULL, func_b, (void *)my_xyz);

ersetzen.

my_xyz ist ein Zeiger, also enthaelt es bereits die Adresse.

greetz by
squeez
_________________
[nothing]
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 07. Mai 2005 8:15   Titel:

Vielen Dank!
 
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy