Deadlock vermeiden



  • Hallo,
    wir sollen bei einem vorgegebenem Programm ein Deadlock verhindern und das auf zwei verschiedene Möglichkeiten.
    Es gibt zwei Ressourcen, die von zwei Threads in umgekehrter Reihenfolge beansprucht werden. Die Reihenfolge der Ressourcenbeanspruchung soll nicht geändert werden. Es soll auch keine feste Threadablaufreihenfolge eingebaut werden.

    Meine erste Möglichkeit ist, dass ich einen globalen Lock einbaue, der genau dann gelockt wird, sobald eine Ressource beansprucht wird. Z. B. Thread T2 muss solange warten, bis T1 beide Ressourcen freigegeben hat.

    Eine zweite Möglichkeit fällt mir aufgrund der Einschränkungen nicht ein.

    Hat jemand eine Idee?
    Bitte keinen Code vorgeben, sondern lediglich beschreiben wie ihr vorgehen würdet, da das evtl. mein Prof. lesen könnte.

    void
    run_thread_one(thread_args_t *args){
    
        /* say hello to the world. */
        printf("Hello world, I'm thread %d\n",args->ident);
    
        printf("thread %d about to get resource A \n",args->ident);
    
        pthread_mutex_lock(args->resA);
        /* mutual exclusion section */
        {
    
    	printf("thread %d: I got resource A \n",args->ident);
    	/* don't delete this */
    	sleep(1);
    
    	printf("thread %d about to get resource B \n",args->ident);
    	pthread_mutex_lock(args->resB);
    
    	printf("thread %d: I've both resouces :) \n",args->ident);
    
        }
        	pthread_mutex_unlock(args->resB);
    	pthread_mutex_unlock(args->resA);
    
    }
    
    void
    run_thread_two(thread_args_t *args){
    
        /* say hello to the world. */
        printf("Hello world, I'm thread %d\n",args->ident);
    
        printf("thread %d about to get resource B \n",args->ident);
        pthread_mutex_lock(args->resB);
        /* mutual exclusion section */
        {
    	printf("thread %d: I got resource B \n",args->ident);
    	/* don't delete this */
    	sleep(1);
    
    	printf("thread %d about to get resource A \n",args->ident);
    	pthread_mutex_lock(args->resA);
    
    	printf("thread %d: I've both resouces :) \n",args->ident);
    
        }
        	pthread_mutex_unlock(args->resB);
    	pthread_mutex_unlock(args->resA);
    
    }
    

    Danke im Voraus!

    L. G.
    Steffo



  • Die Reihenfolge der Ressourcenbeanspruchung soll nicht geändert werden

    Und das heisst? Ressource und Mutex sind zwei verschiedene Dinge. Eine Moeglichkeit ist, die Mutexe in gleicher Reihenfolge zu locken. Eine andere, try_lock zu verwenden.



  • Ne, die Mutexe dürfen nicht in gleicher Reihenfolge gelockt werden.
    trylock: Hatte ich vorher auch versucht, aber ich kam nicht auf die richtige Lösung. Jetzt habe ich sie, danke. 🙂

    L. G.
    Steffo


Anmelden zum Antworten