PVST - Processi vs Thread¶
1#include <unistd.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <sys/wait.h>
5
6#include <pthread.h>
7
8#define INIT_VALUE 0
9#define PARENT_VAL 1
10#define TCHILD_VAL 2
11#define PCHILD_VAL 3
12
13volatile int global_var = INIT_VALUE;
14
15void* child_func(void *par){
16 *((int*)par) = 1;
17 global_var = TCHILD_VAL;
18 printf("I'm the child and I wrote the global var: %d\n", global_var);
19 pthread_exit(par);
20}
21
22int main(){
23 pthread_t ctid;
24 int res, *status;
25 printf("I'm a thread. "
26 "I'm going to create another thread\n");
27 res = pthread_create(&ctid, NULL, child_func, status);
28 global_var = PARENT_VAL;
29 if(res != 0) printf("I cannot create a child");
30 else{
31 printf("I'm now a parent thread. "
32 "I'll wait for my child thread %lu to die...\n", ctid);
33 pthread_join(ctid, (void*)&status);
34 printf("My child has invoked %d\n",*status);
35 }
36 printf("My child is dead, so it's my time to die. Global var: %d\n", global_var);
37 global_var = PARENT_VAL;
38 res = fork();
39 if(res == -1) exit(1);
40 if(res == 0){
41 global_var = PCHILD_VAL;
42 printf("Child Global var: %d\n", global_var);
43 exit(0);
44 }
45 wait(&res);
46 printf("Parent Global var: %d\n", global_var);
47 return 0;
48}
Processi vs Thread (PVST ) è un programma C il cui scopo è quello di evidenziare differenze basilari tra processi e thread.
Il programma è diviso in due sezioni:
il main thread crea un thread child secondo lo schema proposto in PFEW. Entrambi i thread scrivono sulla variabile globale
global_var
e successivamente ne stampano il valore su standard output.il main thread crea un processo child secondo lo schema proposto in FEW. Entrambi i processi scrivono sulla variabile globale
global_var
e successivamente ne stampano il valore su standard output.
La variabile global_var
viene stampata 4 volte, rispettivamente
18printf("I'm the child and I wrote the global var: %d\n", global_var);
36printf("My child is dead, so it's my time to die. Global var: %d\n", global_var);
42 printf("Child Global var: %d\n", global_var);
46printf("Parent Global var: %d\n", global_var);
Question
Cosa stampano le righe 18, 36, 42 e 46?