PThread Mutex Fehler auf manchen Systemen



  • Hallo,

    es geht um Programmierung mit der PThread Bibliothek.
    Auf Mac OS X 10.6.7 läuft der Code ohne Fehler durch. Auf SuSe 11.4 kracht es immer zu verschiedenen Zeiten (das Programm läuft 10 Sekunden und simuliert das Steuereintreiben zwischen verschiedenen Bürgern. Die Bürger werden zufällig ausgewählt und jeder wird von einem Thread repräsentiert).

    Folgender Fehler tritt auf:

    tcdsim: pthread_mutex_lock.c:62: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
    

    Folgender Code zeigt die Benutzung der Mutexe. Ist ein Minimalbeispiel.

    pthread_mutex_t* m2;
    	pthread_mutex_t* m1;
    
    	if(eintreiber->id > aBuerger->id) {
    		m1 = &aBuerger->lock;		
    		m2 = &eintreiber->lock;
    	} else {
    		m1 = &eintreiber->lock;
    		m2 = &aBuerger->lock;
    	}
    
        /*  
          * um ein paar deadlocks zu verhindern, die mutexe
          * nach id ordnen und den mit größerer zuerst locken
          */  
    
         pthread_mutex_t* m2; 
         pthread_mutex_t* m1; 
    
         if(eintreiber->id > aBuerger->id) {
              printInfo("Zuerst Eintreiber locken\n");
              m1 = &aBuerger->lock;    
              m2 = &eintreiber->lock;
         } else {
              printInfo("Zuerst Bürger locken\n");
              m1 = &eintreiber->lock;
              m2 = &aBuerger->lock;
         }   
    
         /* versuche mutexe zu locken */
    
         pthread_mutex_lock(m2);
    
         while(1) {
              if(!pthread_mutex_trylock(m1)) {
                   printInfo("beide Locks bekommen\n");
                   break;    
              } else {
                   pthread_mutex_unlock(m1);
              }   
         }    
    
         pthread_mutex_unlock(m1);
         pthread_mutex_unlock(m2);
    

    Falls dort ein grober Fehler zu finden ist, wäre da toll. Ansich reicht mir schon eine "Idee" zur Fehlersuche. Hilft mir bei solch einer Sache debuggen überhaupt?

    Vielen Dank im Voraus,
    Mario



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Moin... ich steig so schnell durch dein source nicht durch.
    Aber prüf doch mal ob ein mutex von thread 1 gelocked wird und von thread 2 geunlocked. das darf nicht passieren.

    wenn thread 1 mutex 1 locked, dann muss thread 1 diesen mutex auch wieder unlocken.

    falls deine anwendung dieses verhalten aber benötigt, solltest du semaphore dafür benutzen.


Anmelden zum Antworten