2016-10-16 2 views
-1

ich in C durch einen Faden Übung arbeite, ist es ein typischer Code Scheduling-Thread viele Schulen lehren, ein grundlegend man hier zu sehen ist, mein Code außer für meine veränderten Kanalverfahren im Grunde das gleiche ist http://webhome.csc.uvic.ca/~wkui/Courses/CSC360/pthreadScheduling.cWie übergeben Sie einen bestimmten Wert an einen Thread?

Was Ich ändere im Prinzip den Läufer-Teil, so dass mein Code ein Array mit Zufallszahlen in einem bestimmten Bereich druckt, anstatt nur einige Wörter zu drucken. mein runner-Code ist hier:

void *runner(void *param) { 
    int i, j, total; 
    int threadarray[100]; 

    for (i = 0; i < 100; i++) 
     threadarray[i] = rand() % ((199 + modifier*100) + 1 - (100 + modifier*100)) + (100 + modifier*100); 

    /* prints array and add to total */ 
    for (j = 0; j < 100; j += 10) { 
     printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", threadarray[j], threadarray[j+1], threadarray[j+2], threadarray[j+3], threadarray[j+4], threadarray[j+5], threadarray[j+6], threadarray[j+7], threadarray[j+8], threadarray[j+9]); 
     total = total + threadarray[j] + threadarray[j+1] + threadarray[j+2] + threadarray[j+3] + threadarray[j+4] + threadarray[j+5] + threadarray[j+6] + threadarray[j+7] + threadarray[j+8] + threadarray[j+9]; 
    } 
    printf("Thread %d finished running, total is: %d\n", pthread_self(), total); 
    pthread_exit(0); 
} 

Meine Frage für Schleife in der ersten liegt, wo ich Zufallszahlen zu meinem Array bin zuweisen, möchte ich dieser Modifikator Grundlage ändern, auf dem Thread es ist, aber ich kann nicht finde heraus, wie es gemacht wird, zum Beispiel, wenn es der erste Thread ist, wird der Bereich 100-199 sein, der zweite wird 200-299, usw. und so weiter. Ich habe versucht, ich einem Wert zuzuweisen, bevor ich pthread_create mache und diesen Wert einem int in runner als Modifikator zuweise, aber da es 5 gleichzeitige Threads gibt, ordnet er diese Nummer schließlich allen 5 Threads zu, und sie haben am Ende derselbe Modifikator.

Also ich bin auf der Suche nach einer Methode, um dies zu erreichen, wo es für alle einzelnen Threads arbeiten wird, anstatt es allen zuzuweisen, habe ich versucht, die Parameter zu etwas wie (void *param, int modifier) zu ändern, aber wenn ich das tue ich habe keine Ahnung, wie Läufer zu verweisen, da standardmäßig wie pthread_create(&tid[i],&attr,runner,NULL);

Antwort

0

Sie param Punkt auf eine Datenstruktur oder Variable, die Lebensdauer wird länger als die Thread-Lebensdauer bestehen. Und Sie übergeben den Parameter void* an den tatsächlichen Datentyp, dem er zugewiesen wurde.

einfaches Beispiel:

struct thread_data 
{ 
    int thread_index; 
    int start; 
    int end; 
} 

struct thread_info; 
{ 
    struct thread_data data; 
    pthread_t thread; 
} 

struct thread_info threads[10]; 

for (int x = 0; x < 10; x++) 
{ 
    struct thread_data* pData = (struct thread_data*)malloc(sizeof(struct thread_data)); // never pass a stack variable as a thread parameter. Always allocate it from the heap. 

    pData->thread_index = x; 
    pData->start = 100 * x + 1; 
    pData->end = 100*(x+1) - 1; 
    pthread_create(&(threads[x].thread), NULL, runner, pData); 
} 

Dann wird Ihr Läufer:

void *runner(void *param) 
{ 
    struct thread_data* data = (struct thread_data*)param; 
    int modifier = data->thread_index; 
    int i, j, total; 
    int threadarray[100]; 

    for (i = 0; i < 100; i++) 
    { 
     threadarray[i] = ... 
    } 
Verwandte Themen