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:

  1. 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.

  2. 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?