LABSO 15 2020-2021 Thread
LABSO 15 2020-2021 Thread
Aniello Castiglione
Email: [email protected]
Introduzione
3
Motivazioni (cont.)
• getconf GNU_LIBPTHREAD_VERSION
11
Libreria Pthread
#include <pthread.h>
int pthread_equal (pthread_t tid1, phtread_t tid2);
18
Creazione di thread (4)
19
Creazione di thread: esempio
pthread_t ntid;
void printids(const char *s)
{
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf(“%s pid %lu tid %lu (0x%lx)\n”, s, (pid_t)
pid,(unsigned long) tid, (unsigned long) tid);
}
void * thr_fn(void *arg)
{
printids(“nuovo thread: “); 20
return ((void *)0);
}
Creazione di thread: esempio
21
Creazione di thread: esempio (cont.)
• Gli ID dei thread sembrano puntatori, anche se sono rappresentati come interi lunghi
senza segno
• Su sistemi GNU/Linux (LinuxThreads) l’esecuzione del programma fornisce i risultati
seguenti:
$ ./a.out
nuovo thread: pid 6628 tid 1026 (0x402)
thread principale: pid 6626 tid 1024 (0x400)
• Osserviamo come l’ID del processo non corrisponde
• Questo è dovuto ad un artefatto dell’implementazione dei thread LinuxThreads, dove la
system call clone crea un processo figlio che può condividere una quantità del contesto
dell’esecuzione del genitore, come descrittori di file e memoria
• Osserviamo anche che l’output del thread principale appare dopo l’output del thread che
25
creiamo
Creazione thread: passaggio
parametri
sleep(1);
27
return 0;
}
Terminazione di thread
29
Terminazione di thread (cont.)
31
Terminazione di thread: esempio
void *
thr_fn1(void *arg)
{
printf("thread 1 returning\n");
return((void *)1);
}
void *
thr_fn2(void *arg)
{
printf("thread 2 exiting\n");
pthread_exit((void *)2);
} 32
Terminazione di thread: esempio
int
34
Stato di uscita: esempio 1
35
Stato di uscita: esempio 1 (cont.)
pthread_create(&tid,NULL,compute_prime, (void*)&which_prime);
38
Joining di thread: esempio
tid2_args.character = ‘y’;
tid2_args.count = 20000;
pthread_create(&tid2,NULL, char_print, &tid2_args);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
40
return 0;
}
Ancora sul passaggio dei parametri
struct foo {
int a, b, c, d;
};
void
printfoo(const char *s, const struct foo *fp)
{
printf(“%s”,s);
printf(" structure at 0x%lx\n”,(unsigned long)fp);
printf(" foo.a = %d\n", fp->a);
printf(" foo.b = %d\n", fp->b);
printf(" foo.c = %d\n", fp->c);
printf(" foo.d = %d\n", fp->d);
} 42
Esempio (cont.)
void *
thr_fn2(void *arg)
{
printf("thread 2: ID is %lu\n”,(unsigned long)pthread_self());
pthread_exit((void *)0);
}
43
Esempio (cont.)
int main(void)
47
Esempio (cont.)
51
Distacco di un thread
#include <pthread.h>
int pthread_detach(pthread_t tid);
//restituisce 0 se OK, numero di errore se
fallisce
52
Thread vs processo
54
Attributi dei Thread
56
Funzioni attributi
detachstate PTHREAD_CREATE_JOINABLE
PTHREAD_CREATE_DETACHED
stackaddr NULL,
stacksize NULL, PTHREAD_STACK_MIN
priority NULL
schedpolicy SCHED_OTHER, SCHED_FIFO,
SCHED_RR
ineritsched PTHREAD_EXPLICIT_SCHED,
PTHREAD_EXPLICIT_SCHED
59
Funzioni per gli attributi
err = pthread_attr_init(&attr);
if (err !=0)
return(err);
err = pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
if (err==0)
err = pthread_create(&tid,&attr,fn,arg);
pthread_attr_destroy(&attr); 62
return(err);
}
pthread_once()
66
Thread e segnali
69
La chiamata clone di LINUX
int main()
{
pthread_t thread1, thread2;
char *message1 = "Thread 1";
char *message2 = "Thread 2";
int iret1, iret2;
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
sleep(1);
id_ptr = (int *) threadid;
taskid = *id_ptr;
printf("Thread %d\n", taskid);
74
pthread_exit(NULL);
}
Esempio 2 (cont.) errato
77
Esercizio 2
78