Somewhat like a “lightweight process.”
errno
—in TLS (Thread Local Storage)
%r14
#include <pthread.h>
int pthread_create(pthread_t* thread, pthread_attr_t const* attr, void* (*start)(void*), void* arg);
void pthread_exit(void* value);
void pthread_join(pthread_t* thread, void** value);
int pthread_kill(pthread_t* t, int sig);
int pthread_cancel(pthread_t* t);
Can cause an asynchronous function call to occur at anytime between machine instructions.
Note that instructions are not necessarily atomic.
Signal advice:
int volatile x;
void handle(int sig) { x = 1; }
...
if (x) {
...
}
volatile
makes sure accesses/writes to x
are not optimized away
What if you need your handler to not be that small?
void handle(int sig) {
char* p = malloc(1000);
*p = q;
free(p);
}
This is horrible: if calling malloc
within the thread, it will destroy the data structure.
Make sure to only call async-signal safe functions.
close
is async-signal safe.
printf
is not async-signal safe (uses some buffer to putchar
)