Miscellaneous

One-Time Initialization (1)

Where’s the bug?

Bad code
static X *global;

void use_global()
{
    if (global == NULL)
        global = new X;
    // ... use global ...
}

One-Time Initialization (2)

Good code
static pthread_once_t global_once = PTHREAD_ONCE_INIT;
static X *global;
static void init_global() { global = new X; }

void use_global()
{
    pthread_once(&global_once, init_global);
    // ... use global ...
}

One-Time Initialization (3)

int pthread_once(pthread_once_t *once_control,
       void (*init_routine)(void));
pthread_once_t once_control = PTHREAD_ONCE_INIT;

Thread Specific Data, Thread Local Storage

POSIX thread API for Thread Specific Data - per thread global variables ⟶ man 3 pthread_key_create (including example).

Non-portable alternative:

__thread Keyword
static __thread X* global;