2017-06-01 4 views
-1
#include <stdio.h> 
#include <pthread.h> 
#include <unistd.h> 
#include <stdlib.h> 

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
void* thread_even(void* arg); 
void* thread_odd(void* arg); 

int main(int argc, char** argv) { 

    pthread_t tid[2]; 

    pthread_create(&tid[0], 0, &thread_even, 0); 
    pthread_create(&tid[1], 0, &thread_odd, 0); 

    pthread_join(tid[0], NULL); 
    pthread_join(tid[1], NULL); 

    return 0; 
} 

void* thread_even(void* arg) { 
    int* thread_id = (int*)arg; 

    pthread_mutex_lock(&mutex); 

    for(int i = 1; i <= *thread_id; i++) 
    { 
     if(i%2 != 0) 
     { 
      printf("Thread 1: %d", i); 
     } 
    } 

    pthread_mutex_unlock(&mutex); 

    return NULL; 
} 

void* thread_odd(void* arg) { 
    int* thread_id = (int*)arg; 

    pthread_mutex_lock(&mutex); 

    for(int i = 1; i <= *thread_id; i++) 
    { 
     if(i%2 == 0) 
     { 
      printf("Thread 2: %d", i); 
     } 
    } 

    pthread_mutex_unlock(&mutex); 

    return NULL; 
} 

Die oben ist der Code arbeite ich an, aber ich ein Segment Fehlerfehler bekommen ... Was ich will, erreichen, ist zum BeispielAusdrucke von geraden und ungeraden Zahlen Fäden in C

wenn 1

Gewinde 2:: I kompilieren und laufen mit einem Argument 8 (./number 8)

sollte es

Gewinde 1 auszudrucken 2

Faden 1: 3

... usw., bis die Nummer 8.

in dem Thread 1s stehen die geraden Zahlen und das Gewinde 2s für die ungeraden Zahlen darstellen sollte.

Bitte helfen ... Ich möchte mein Wissen über C zu entwickeln, aber habe niemanden zu fragen. Danke.

+1

'int * thread_id = (int *) arg;' - ähm ... Sie haben 'NULL' als Argument für' pthread_create' übergeben, was 'arg' hier ist. Es überrascht nicht, 'i <= * thread_id' dereferences 'NULL' und ruft somit * undefined behaviour * auf. – WhozCraig

+0

Was soll ich dann als Argument übergeben, um das Programm erfolgreich zu machen? Vielen Dank! – seung

+0

@seung, siehe meine Antwort. Auch die Verriegelung, die Sie getan haben, ist wahrscheinlich grober, als Sie suchen. Wie Sie es jetzt haben, wird effektiv ein Thread abgeschlossen, und dann wird der andere ausgeführt. –

Antwort

0

Sieht aus wie Sie vorbei 0 AKA NULL zum letzten Parameter pthread_create, und dann Sie folgendermaßen vorgehen:

int* thread_id = (int*)arg; 
pthread_mutex_lock(&mutex); 
for(int i = 1; i <= *thread_id; i++) 

So thread_id sicherlich NULL sein wird, verweist es wird ein SEGFAULT sein.

Wenn Sie möchten, eine obere Schranke passieren für jeden Thread zu laufen, tun Sie etwas tun können:

int main(int argc, char** argv) { 

    pthread_t tid[2]; 
    int *ids = malloc(2 * sizeof(int)); 
    ids[0] = 10; /* upper bound for thread 1 */ 
    ids[1] = 10; /* upper bound for thread 2 */ 

    pthread_create(&tid[0], 0, &thread_even, &ids[0]); 
    pthread_create(&tid[1], 0, &thread_odd, &ids[1]); 

    pthread_join(tid[0], NULL); 
    pthread_join(tid[1], NULL); 

    free(ids); 
    return 0; 
} 

Es gibt Möglichkeiten, dies zu tun, ohne Zuordnung Haufen zurückgegriffen, aber das ist die am einfachsten.

+0

vielen Dank! aber es druckt Thread 1 Thread 1 und Thread 2 Thread2 wie folgt aus. Gibt es eine Möglichkeit, sie alternativ auszudrucken? – seung

+0

Wie mein Kommentar erwähnt hat, werden Ihre Mutexe, wie Sie es geschrieben haben, alle einen Thread tun. Wie man dieses Problem löst, ist eine separate Frage. –

Verwandte Themen