Threading and synchronization utilities¶
libuv provides cross-platform implementations for multiple threading and synchronization primitives. The API largely follows the pthreads API.
Data types¶
-
uv_thread_t¶ Thread data type.
-
void
(*uv_thread_cb)(void* arg)¶ Callback that is invoked to initialize thread execution. arg is the same value that was passed to
uv_thread_create().
-
uv_key_t¶ Thread-local key data type.
-
uv_once_t¶ Once-only initializer data type.
-
uv_mutex_t¶ Mutex data type.
-
uv_rwlock_t¶ Read-write lock data type.
-
uv_sem_t¶ Semaphore data type.
-
uv_cond_t¶ Condition data type.
-
uv_barrier_t¶ Barrier data type.
API¶
Threads¶
-
int
uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg)¶ Changed in version 1.4.1: returns a UV_E* error code on failure
-
uv_thread_t
uv_thread_self(void)¶
-
int
uv_thread_join(uv_thread_t *tid)¶
-
int
uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2)¶
Thread-local storage¶
Note
The total thread-local storage size may be limited. That is, it may not be possible to create many TLS keys.
Once-only initialization¶
Runs a function once and only once. Concurrent calls to uv_once() with the
same guard will block all callers except one (it’s unspecified which one).
The guard should be initialized statically with the UV_ONCE_INIT macro.
Mutex locks¶
Functions return 0 on success or an error code < 0 (unless the return type is void, of course).
-
int
uv_mutex_init(uv_mutex_t* handle)¶
-
void
uv_mutex_destroy(uv_mutex_t* handle)¶
-
void
uv_mutex_lock(uv_mutex_t* handle)¶
-
int
uv_mutex_trylock(uv_mutex_t* handle)¶
-
void
uv_mutex_unlock(uv_mutex_t* handle)¶
Read-write locks¶
Functions return 0 on success or an error code < 0 (unless the return type is void, of course).
-
int
uv_rwlock_init(uv_rwlock_t* rwlock)¶
-
void
uv_rwlock_destroy(uv_rwlock_t* rwlock)¶
-
void
uv_rwlock_rdlock(uv_rwlock_t* rwlock)¶
-
int
uv_rwlock_tryrdlock(uv_rwlock_t* rwlock)¶
-
void
uv_rwlock_rdunlock(uv_rwlock_t* rwlock)¶
-
void
uv_rwlock_wrlock(uv_rwlock_t* rwlock)¶
-
int
uv_rwlock_trywrlock(uv_rwlock_t* rwlock)¶
-
void
uv_rwlock_wrunlock(uv_rwlock_t* rwlock)¶
Semaphores¶
Functions return 0 on success or an error code < 0 (unless the return type is void, of course).
Conditions¶
Functions return 0 on success or an error code < 0 (unless the return type is void, of course).
Note
Callers should be prepared to deal with spurious wakeups on uv_cond_wait() and
uv_cond_timedwait().
-
void
uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex)¶
-
int
uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout)¶
Barriers¶
Functions return 0 on success or an error code < 0 (unless the return type is void, of course).
Note
uv_barrier_wait() returns a value > 0 to an arbitrarily chosen “serializer” thread
to facilitate cleanup, i.e.
if (uv_barrier_wait(&barrier) > 0)
uv_barrier_destroy(&barrier);
-
int
uv_barrier_init(uv_barrier_t* barrier, unsigned int count)¶
-
void
uv_barrier_destroy(uv_barrier_t* barrier)¶
-
int
uv_barrier_wait(uv_barrier_t* barrier)¶