2012-04-15 6 views
8

Ich habe ein großes Problem, ich kann nicht herausfinden, warum Mutexe in C nicht so funktionieren, wie ich es erwarte. Dies ist mein Code:POSIX C-Threads. Mutex-Beispiel. Funktioniert nicht wie erwartet

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

pthread_t mythread; 
pthread_mutex_t mymutex; 

void *anotherFunc(void*) 
{ 
    pthread_mutex_lock(&mymutex); 

    for(int i = 0; i < 100; i++) 
     printf("anotherFunc\n"); 

    pthread_mutex_unlock(&mymutex); 

    pthread_exit(NULL); 
} 

void *func(void*) 
{ 
    pthread_mutex_lock(&mymutex); 

    for(int i = 0; i < 100; i++) 
     printf("func\n"); 

    pthread_mutex_unlock(&mymutex); 

    pthread_exit(NULL); 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_mutex_init(&mymutex, NULL); 

    pthread_create(&mythread, NULL, func, NULL); 
    pthread_create(&mythread, NULL, anotherFunc, NULL); 

    pthread_mutex_destroy(&mymutex); 

    pthread_exit(NULL); 
    return EXIT_SUCCESS; 
} 

Was ich passieren erwarten, dass das Programm zunächst 100 „Func“ -Nachrichten und dann 100 „anotherFunc“ -Nachrichten zu drucken. Was ich erwarte, ist die Ausführung, um func zu erreichen und den Mutex zu sperren. Wenn die Ausführung anotherFunc erreicht, erwarte ich zu warten, bis Func den Mutex freigibt. Aber ich bekomme gestörter Nachrichten wie

func func func anotherFunc anotherFunc anotherFunc func anotherFunc

Ich verstehe nicht, wie dieses Ding funktioniert. Bitte helfen Sie!

Antwort

16
pthread_create(&mythread, NULL, func, NULL); 
pthread_create(&mythread, NULL, anotherFunc, NULL); 

pthread_mutex_destroy(&mymutex); 

Sie zerstören den Mutex vor die Fäden mit ihm getan, so werden alle Wetten ausgeschaltet sind. Sie werden wahrscheinlich die 2 Threads pthread_join wollen, bevor Sie es zerstören.

+0

verwenden ich denke, es funktioniert :) Diese meine letzte Code ist für alle interessierten ... http://pastebin.me/bc23773578d79a55882d7ced4e04b026 –

+0

Immer noch gebrochen. Sie stellen nur sicher, dass * ein * Thread beendet ist, wenn Sie den Mutex zerstören. Was ist, wenn der andere noch nicht fertig ist? Es gibt keine Garantie, dass der Thread startet, den Mutex erwirbt oder in einer bestimmten Reihenfolge endet, es sei denn, Sie erzwingen es irgendwie. (Lektion eins von Multithreading ist dies: Dinge sind nur in einer bestimmten Reihenfolge gesichert, wenn Sie sie in dieser Reihenfolge erzwingen.) –

+0

Ja, aber ich habe beide Funktionen in einem Thread gestartet, der einzige Thread: mythread. Ist es in Ordnung, oder es ist immer sicherer, einen Thread für eine Funktion zu verwenden? –

2

Ich habe einige Fehler comiplation

  • ich nicht int i in für Schleife

  • verwendet, um ein Argument Name arg als Argument für Gewinde "Func" erklären könnte und "anotherFunc"

Ich habe pthread_join vor zerstört den Mutex.

Auf diese Weise ich meine Mutex „mymutex“ haben und „anotherFunc“, nachdem beide Threads „Func“ ihre Ausführung

auch jeweils Fäden nun ihre eigenen Thread-ID hat „mythread1“ abgeschlossen bin zu zerstören und „mythread2“ so auf diese Weise ich pthread_join() Funktion für jeden Thread

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

pthread_t mythread1, mythread2; 
pthread_mutex_t mymutex; 

void *anotherFunc(void *arg) 
{ 
    pthread_mutex_lock(&mymutex); 
    int i; 

    for(i = 0; i < 100; i++) 
     printf("anotherFunc\n"); 

    pthread_mutex_unlock(&mymutex); 

    pthread_exit(NULL); 
} 

void *func(void *arg) 
{ 
    pthread_mutex_lock(&mymutex); 
    int i; 
    for(i = 0; i < 100; i++) 
     printf("func\n"); 

    pthread_mutex_unlock(&mymutex); 

    pthread_exit(NULL); 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_mutex_init(&mymutex, NULL); 

    pthread_create(&mythread1, NULL, func, NULL); 
    pthread_create(&mythread2, NULL, anotherFunc, NULL); 


    pthread_join(mythread1, NULL); 
    pthread_join(mythread2, NULL); 

    pthread_mutex_destroy(&mymutex); 

    return EXIT_SUCCESS; 
} 
Verwandte Themen