2016-10-10 2 views
-2

nicht synchronisieren Ich habe ein Problem, wenn ich versuche, meine Threads zu synchronisieren. Ich habe den nächsten Code:Kann meine Threads in C

static void* CarProcess(void *str); 

int main() 
{ 
    thread_t *pthreadsArray; 
    pthreadsArray = (thread_t*)malloc(sizeof(thread_t) * 10); 

    for (int i = 0; i < 10; i++) 
    { 
     int pthread = mythread_create(&pthreadsArray[i], NULL, CarProcess, i); 
    } 
    for (int i = 0; i < 10; i++) 
    { 
     mythread_join(pthreadsArray[i], NULL); 
    } 
} 

static void* CarProcess(void *str) 
{ 
    while(1){ 
     printf("Thread ID: %i\n", str); 
    } 
} 

Wenn ich das Programm ausführen, ich habe diese Ausgabe:

Thread ID: 0 
Thread ID: 0 
Thread ID: 0 
Thread ID: 0 
... 

aber nie erscheint "Thread ID: 1", "Thread ID: 2", „Thread ID: 3 ".... oder" Thread-ID: 9 ". Ich denke, dass es mit Mutex gelöst werden könnte, Mutex zu sperren und zu entschlüsseln. Hat irgendeine Körper Idee, wie man das löst? Danke

+0

Unrelated auf Ihre Frage, aber ich nehme an, dass Ihr aktuelles Programm eine dynamische Anzahl von Threads hat? Andernfalls ist die Verwendung von 'malloc' einfach unnötig und Sie können einfach ein normales Array verwenden. –

+0

Auch, was ist 'mythread_create' und' mythread_join'? –

+0

danke @JoachimPileborg, aber es scheint, dass Sie nicht viel über Threads wissen .. Erstellen und Join sind Funktionen aus der Thread-Bibliothek .. –

Antwort

2

Eine mögliche Quelle des Problems ist, dass str nicht wirklich eine int Variable ist. Sie müssen ein Casting durchführen (sowohl beim Erstellen des Threads als auch beim Abrufen des Arguments).

Um einen Thread zu erstellen und die Ganzzahl richtig an die Qualität zu übergeben, müssen Sie zuerst den Wert an intptr_t umwandeln. Dies ist ein standard integer type, der groß genug ist, um sowohl eine Ganzzahl als auch einen Zeiger zu enthalten. Dann sollten Sie es auf einen generischen Zeiger gegossen (dh void *):

pthread_create(&pthreadsArray[i], NULL, CarProcess, (void *) (intptr_t) i); 

dann den ganzzahligen Wert in der Thread-Funktion erhalten Sie das Gegenteil Casting tun müssen:

static void* CarProcess(void *str) 
{ 
    int i = (int) (intptr_t) str; 
    printf("Thread ID: %i\n", i); 
} 
+0

Danke, aber das Problem ist nicht in der variablen Casting .. Synchronisiert die Threads .. Ich brauche Multithreading .. –

+2

@ ArturoSalas Wenn der Code ist genau das, was Sie zeigen, dann gibt es keine Notwendigkeit für eine Synchronisierung. Keiner der Threads greift auf freigegebene Daten zu. Die Synchronisierung wird nur benötigt, wenn Sie auf gemeinsam genutzte Daten so zugreifen, dass ein Thread sie ändern kann, während ein anderer Thread sie liest. –

+0

Es wird nur die Nachricht aus dem ersten Thread und nicht die anderen 9 Threads gedruckt .. das ist nicht Multithread –