Thread Life Cycle¶
Thread Life Cycle¶
No parent/child relationship ⟶ anybody can join |
Thread Creation¶
int pthread_create(
pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
thread
: ID of the new thread (output parameter)attr
⟶ see later (NULL
⟶ default attribute)start_routine
: thread start function,void*/void*
arg
: parameter of the start function
Thread Termination (1)¶
Thread termination alternatives:
Return from start function
pthread_exit()
from somewhere inside the thread (cf.exit()
from a process)pthread_cancel()
from outside (cf.kill()
)exit()
of the entire process ⟶ all contained threads are terminated
Danger
Don’t use pthread_cancel()
unless you know what you are doing!
Thread Termination (2)¶
Without any further ado: the manual …
void pthread_exit(void *retval);
int pthread_cancel(pthread_t thread);
Exit Status, pthread_join()
¶
A thread’s “exit status”:
void*
, just like the start parameter ⟶ more flexible than a process’sint
.Parameter to
pthread_exit()
Return type of the start function
int pthread_join(pthread_t thread, void **retval);
Detached Threads¶
Sometimes one does not want to use pthread_join()
Rather, run a thread in the “background”.
“Detached” thread
int pthread_attr_setdetachstate(
pthread_attr_t *attr, int detachstate);
PTHREAD_CREATE_DETACHED
Threads that are created using attr will be created in a
detached state.
Detaching at runtime …
int pthread_detach(pthread_t thread);
Thread ID¶
pthread_create()
returnspthread_t
to the callerThread ID of calling thread:
pthread_self()
Compare using
pthread_equal()
pthread_t pthread_self(void);
int pthread_equal(pthread_t t1, pthread_t t2);
Scheduled Entities (1)¶
Kernel maintains scheduled entities (Process IDs, “1:1 scheduling”)
$ ps -eLf|grep firefox
$ ls -1 /proc/30650/task/
13960
13961
... (many more) ...
Scheduled Entities (2)¶
Too bad:
Scheduled entity’s ID is not the same as
pthread_t
Correlation of OS threads and POSIX thread is Linux specific
pid_t gettid(void);