Sisteme de operare‎ > ‎Laboratoare‎ > ‎

Fire de execuție

Some people, when confronted with a problem, think, “I know, I’ll use threads!” Now they have 10 problems. –Bill Schindler


Folosind mecanismul de thread-uri realizați un program C ce determină numărul de fișiere dintr-o ierarhie de directoare.

Pentru fiecare subdirector de pe primul nivel se va porni un thread nou ce va realiza procesarea subdirectorului respectiv.


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
//funcţia ce va fi executatăde thread-uri
void* print_message( void *ptr ){
        
        char *message;
        message = (char *) ptr;
        printf("%s ", message);
        return NULL;
        
}

int main(){
        
        pthread_t thread1, thread2;
        char *message1 = "Hello";
        char *message2 = "World\n";
        // creearea primului thread – tipăreşte Hello
        if (pthread_create( &thread1, NULL, &print_message, (void*)message1)){
                
                fprintf(stderr,"first thread error\n");
                exit(1);
                
        }
        
        // “adoarme” procesul părinte pentru o secundă.
        sleep(1);
        // creearea celui de al doilea thread – tipăreşte World
        if(pthread_create( &thread2, NULL, &print_message, (void*)message2)){
                
                fprintf(stderr,"second thread error\n");
                exit(1);
                
        }
        
        sleep(1);
        exit(0);
        
}


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

// definirea structurii de date ce va fi transmisă ca argument thread-ului
struct chars {
        
        char val;
        int count;
        
}
;

// funcția thread-ului
void *char_print(void *ptr){
        
        struct chars* c = (struct chars*)ptr;
        for(int i=0;i <c->count;i++) putchar(c->val);
        pthread_exit(0);
        
}

int main(){
        
        pthread_t thread1, thread2;
        struct chars thread1_arg,thread2_arg;
        // stabilirea parametrilor pentru thread-uri
        thread1_arg.val='a';
        thread1_arg.count=100000;
        thread2_arg.val='b';
        thread2_arg.count=150000;
        // creearea thread-urilor
        pthread_create(&thread1,NULL,&char_print,&thread1_arg);
        pthread_create(&thread2,NULL,&char_print,&thread2_arg);

// thread-ul părinte aşteaptă încheierea excuţiei thread-urilor fiu. 
pthread_join(thread1,NULL); 
pthread_join(thread2,NULL);

        // încheierea execuției
        exit(0);
        
}