2017-10-23 2 views
-2

Dies ist für eine Betriebssystem-Programmierzuordnung. Ich versuche zu lesen n Anzahl der Dateien, verwenden Sie Threads, um jede Datei nach einer Anzahl von Vorkommen für ein bestimmtes Zeichen zu suchen. alsSchließen von dynamisch erstellten Threads

./mycount j new.txt some.txt here.txt hello.txt 

Der Ausgang für meinen Testcode sein soll:

argumentCount: 6 
threadCount: 4 
pthread_create() for thread 0 returns: 0 
Thread 1 
pthread_create() for thread 1 returns: 0 
Thread 2 
pthread_create() for thread 2 returns: 0 
Thread 3 
pthread_create() for thread 3 returns: 0 
Thread 4 

jedoch jede Ausführung der mycount verschieden ist, mit dem letzten Thread in der Regel nicht die Ausführung/Drucks. Entweder das oder sie werden sporadisch, im Tandem usw. drucken.

Ich versuche einen Mutex zu verwenden, um die Integrität meiner Daten zu gewährleisten, aber ich bin mir nicht sicher, was wirklich hinter den Kulissen passiert.

Wie stelle ich sicher, dass alles immer gleich abläuft? Der letzte Thread gibt immer 0 zurück, aber manchmal führt er die Funktion nicht vollständig aus.

Code:

//GLOBALS 
int occurrences = 0; 

//PROTOTYPES 
void *scanFile(void *filePtr); 

//Initialize space for mutex. 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

//Receive arguments from .exe call 
void main (int argumentCount, char *argumentVariables[]) 
{ 
    //Exit if argumentCount is > 50. 
    if (argumentCount > 50) 
    { 
     perror("Too many arguments. Enter less than 50.\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("argumentCount: %d \n", argumentCount); 
    //Instantiate variables. 
    //i - iterator 
    //*newCommand - Used to hold string value of first command entered. 
    //*newVector - Used to hold string of the rest of the commands. Is a vector. 
    int i; 
    char *searchCharacter; 
    char *newVector[argumentCount]; 

    //Iterate through command line arguments and split them. 
    for (i = 0; i < argumentCount; i++) 
    { 
     searchCharacter = argumentVariables[1]; 
     if (i < argumentCount - 1) 
     { 
      newVector[i] = argumentVariables[1 + i]; 
     } 
     else 
     { 
      newVector[i] = NULL; 
     } 
    } 

    //Exit if newest command is NULL. 
    if (searchCharacter == NULL) 
    { 
     perror("No character entered!\n"); 
     exit(EXIT_FAILURE); 
    } 

    int threads = argumentCount - 2; 
    printf("threadCount: %d \n", threads); 
    pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

    for (int i = 0; i < threads; i++) 
    { 
     int ret; 
     char *message = "Thread"; 
     ret = pthread_create(&thread[i], NULL, scanFile, (void*) message); 
     if (ret != 0) 
     { 
      printf("Error - pthread_create() return code: %d\n", ret); 
      exit(EXIT_FAILURE); 
     } 

     printf("pthread_create() for thread %d returns: %d\n", i, ret); 
    } 

    exit(EXIT_SUCCESS); 
} 

void *scanFile(void *filePtr) 
{ 
    pthread_mutex_lock(&mutex); 
    char *message; 
    message = (char *) filePtr; 
    occurrences += 1; 
    printf("%s %d\n", message, occurrences); 
    pthread_mutex_unlock(&mutex); 
} 
+0

Wo ist der Code, die * * schließt sich die Fäden? Warum ist das wichtig um sicherzustellen, dass "alle Threads starten und die Arbeit abschließen"? – user2864740

+0

Ich bin mir nicht sicher, wie man ** n ** Threads beitreten kann. Außerdem ist es wichtig für mich sicherzustellen, dass alle ausgeführt werden, da ich in Zukunft jeden Thread brauche, um eine Datei nach einer Anzahl von Vorkommen eines bestimmten Zeichens zu durchsuchen. –

+0

Siehe ["pthread join" (Web)] (https://www.google.com/search?q=pthread+join) und ["pthread join" (SO)] (https://stackoverflow.com/search ? q = Pthread + Join). – user2864740

Antwort

0

die Lösung dank Gefunden user2864740 und Ken Thomases.

Hinzugefügt:

for (int j = 0; j < threads; j++) 
{ 
    //Join the threads so all the data is good to go. 
    pthread_join(thread[j], NULL); 
} 

Korrektur:

for (int i = 0; i < threads; i++) 
{ 
    request[i].file = argumentVariables[i + 2]; 
    request[i].character = searchCharacter; 

    //Create the thread. Any output from the integer newThread is an error code. 
    newThread = pthread_create(&thread[i], NULL, *scanFile, &request[i]); 
    if (newThread != 0) 
    { 
     printf("Error - pthread_create() return code: %d\n", newThread); 
     exit(EXIT_FAILURE); 
    } 
} 

for (int j = 0; j < threads; j++) 
{ 
    //Join the threads so all the data is good to go. 
    pthread_join(thread[j], NULL); 
} 
+0

Nun, das löst das Problem, eliminiert aber die Nebenläufigkeit. Das heißt, Sie profitieren nicht mehr von der Verwendung mehrerer Threads. Du erstellst eins nach dem anderen und wartest darauf, dass dieses beendet wird, bevor das nächste gestartet wird. Sie sollten sie alle erstellen, bevor Sie einer von ihnen beitreten. –

+0

@KenThomases Ich habe es herausgefunden! Funktioniert wie erwartet. –

Verwandte Themen