User Tools

Site Tools


it:informatica:posix:threads_esempio1
Return to Home page

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

it:informatica:posix:threads_esempio1 [2017/11/30 06:59]
it:informatica:posix:threads_esempio1 [2020/11/26 23:18] (current)
Line 1: Line 1:
 +====== Threads Esempio 1 ======
 +**Concetti:**\\
 +Esempio riguardante le funzionalità principali dei thread POSIX
  
 +**Testo:**\\
 +Realizzare un programma di esempio di utilizzo delle funzionalità dei thread
 +
 +**Soluzione:**\\
 +<file C threads_esempio1.c>
 +/* 
 +   - Creazione di thread con pthread_create
 +   - Passaggio ai thread di una struttura con valori diversi per ogni thread
 +   - Passaggio di un valore di ritorno tra i thread e il main
 +   - Attesa di thread con pthread_join
 +*/
 +
 +#include <stdio.h>
 +#include <unistd.h>
 +#include <ctype.h>
 +#include <pthread.h>
 +
 +#define N_THREAD 3
 +
 +
 +/* Variabile globale, tutti i thread vedono questo valore, se un thread ne modifica il valore anche gli altri thread lo vedono modificato */
 +int global_variable = 10;
 +
 +
 +typedef struct {
 +  int thread_num;
 +  char letter;
 +} my_t;
 +
 +
 +static void *process (void *arg)
 +{
 +  int i;
 +  my_t *param = (my_t *) arg; // cast the void argument to the real type
 +
 +  if (param->thread_num == 0) global_variable = 20;
 +  fprintf (stdout, "Starting thread %d, letter=%c, global_variable=%d\n", param->thread_num, param->letter, global_variable);
 +  for (i = 0; i < 10; i++) 
 +    write (STDOUT_FILENO, &(param->letter), 1); /* Di default quando un processo viene lanciato vengono aperti i file descriptor 0, 1 e 2, ed associati rispettivamente a stdin, stdout e stderr */
 +  printf("\n");
 +  param->letter = toupper(param->letter);
 +  pthread_exit(&(param->letter));
 +}
 +
 +
 +int main (void)
 +{
 +  int retcode;
 +  pthread_t th[N_THREAD];
 +  char *retval;
 +  my_t value[N_THREAD];
 +  int i = 0;
 +  
 +  for(i=0; i<N_THREAD; i++){
 +    value[i].letter = 'a'+i;
 +  }
 +
 +  for(i=0; i<N_THREAD; i++){
 +    value[i].thread_num = i;
 +    retcode = pthread_create (&th[i], NULL, process, (void *) &(value[i]));
 +    if (retcode != 0)
 +      fprintf (stderr, "pthread_create failed %d\n", retcode);
 +  }
 +
 +
 +  for(i=0; i<N_THREAD; i++){
 +
 +    retcode = pthread_join (th[i], (void *)&retval);
 +    if (retcode != 0)
 +      fprintf (stderr, "pthread_join failed %d\n", retcode);
 +
 +    fprintf(stdout, "retval : %c\n", *(retval) );
 + }
 +
 +  return 0;
 +}
 +</file>
 +
 +**Commenti:**\\

If you found any error, or if you want to partecipate to the editing of this wiki, please contact: admin [at] skenz.it

You can reuse, distribute or modify the content of this page, but you must cite in any document (or webpage) this url: https://www.skenz.it/it/informatica/posix/threads_esempio1?rev=1512021553&do=diff