esempio libreria pthread in c

Vediamo ora un esempio di utilizzo della libreria pthread in C. Scriviamo un programma che troverà tutti i numeri primi minori ed uguali ad un numero passato a linea di comando.

Per prima cosa in C bisogna includere le librerie che si utilizzeranno.

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

importo quindi la libreria pthread per la gestione dei thread, la libreria stdio per comunicare i risultati e la stdlib per gestire l’input.

Dichiaro poi le variabili che utilizzero’ per far comunicare il processo padre e i suoi thred e le funzioni che verranno esplicitate più sotto.

long int value = 0, upper_limit;
int isPrime( int number );
void *runner( void *param );

qui particolarmente rilevante è *runner(): definendo il thread dirò che la sua esecuzione inizierà da questa funzione.

Segue poi il corpo principale del programma e le definizioni delle variabili locali alla funzione

int main( int argc, char * argv[] )
{
        int pid;
        pthread_t tid;
        pthread_attr_t attr;
        char *endptr;

qui la variabile tid verrà usata per contenere l’identificativo del thread, mentre attr è una struttura con gli attributi del thread relativi ad esempio allo scheduling. Qui non li specifichiamo ed utilizzeremo i valori di default.

Recupero il parametro in ingresso controllando l’esistenza del parametro stesso

        if ( argc < 2 ) {
                printf( "Usage: %s ", argv[1] );
        } else upper_limit =  strtol(argv[1], &endptr, 10 );

        printf("PARENT: upper_limit = %d\n", (int)upper_limit );

Passo poi alla generazione del thread vero e proprio:
Per prima cosa recupero i valori di default per attr

        pthread_attr_init( &attr );

Creo poi il thread recuperando il tid, gli attr e specificando che l’esecuzione del thread deve essere nella funzione runner.

        pthread_create( &tid, &attr, runner, NULL );

devo poi solo attendere la conclusione delle attività del thread.

        
        pthread_join( tid, NULL );

Concludo poi l’esecuzione.

        printf( "End of Child\n" );
}

Seguono poi le due funzioni che sono utilizzate in questo programma. La prima è quella che verifica se un numero è primo. Non è particolarmente efficace ma è chiara e semplice e assolutamente adeguata ad un esempio di uso dei thread.

int isPrime(int number)
{
    int i;
    for ( i = 2; i < number; i++)
    {
      if (number % i == 0 && i != number)
        return 0;
    }
    return 1;
}

Semplicemente, per il numero che viene passato, verifico tutti i possibili divisori.

Segue poi la funzione richiamata con il thread:

void *runner( void *param ) {
        int prime;
        int lista[upper_limit];
        int i,j;
        printf( "START runner: %d\n", (int)upper_limit );

        printf("1\n");
        for( i = 2; i <= upper_limit; i++ ){
                if( isPrime( i ) ) printf("%d\n", i);
        }
        pthread_exit(0);
}

funzione che scriverà a video i numeri individuati come primi dalla funzione precedente.

Riporto sotto il listato dell’intero programma. Per compilarlo con gcc bisogna specificare il parametro -pthread.

gcc -pthread prime_thread.c


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

long int value = 0, upper_limit;
int isPrime( int number );
void *runner( void *param );

int main( int argc, char * argv[] )
{
        int pid;
        pthread_t tid;
        pthread_attr_t attr;
        char *endptr;

        if ( argc < 2 ) {
                printf( "Usage: %s ", argv[1] );
        } else upper_limit =  strtol(argv[1], &endptr, 10 );

        printf("PARENT: upper_limit = %d\n", (int)upper_limit );

        pthread_attr_init( &attr );
        pthread_create( &tid, &attr, runner, NULL ); 
        pthread_join( tid, NULL ); 
        printf( "End of Child\n" );
}

int isPrime(int number)
{
    int i;
    for ( i = 2; i < number; i++)
    {
      if (number % i == 0 && i != number)
        return 0;
    }
    return 1;
}

void *runner( void *param ) {
        int prime;
        int lista[upper_limit];
        int i,j;

        printf( "START runner: %d\n", (int)upper_limit );

        printf("1\n");
        for( i = 2; i <= upper_limit; i++ ){
                if( isPrime( i ) ) printf("%d\n", i);
        }
        pthread_exit(0);
}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *