comparison third_party/libuv/docs/src/threading.rst @ 160:948de3f54cea

[ThirdParty] Added libuv
author June Park <parkjune1995@gmail.com>
date Wed, 14 Jan 2026 19:39:52 -0800
parents
children
comparison
equal deleted inserted replaced
159:05cf9467a1c3 160:948de3f54cea
1
2 .. _threading:
3
4 Threading and synchronization utilities
5 =======================================
6
7 libuv provides cross-platform implementations for multiple threading and
8 synchronization primitives. The API largely follows the pthreads API.
9
10
11 Data types
12 ----------
13
14 .. c:type:: uv_thread_t
15
16 Thread data type.
17
18 .. c:type:: void (*uv_thread_cb)(void* arg)
19
20 Callback that is invoked to initialize thread execution. `arg` is the same
21 value that was passed to :c:func:`uv_thread_create`.
22
23 .. c:type:: uv_key_t
24
25 Thread-local key data type.
26
27 .. c:type:: uv_once_t
28
29 Once-only initializer data type.
30
31 .. c:type:: uv_mutex_t
32
33 Mutex data type.
34
35 .. c:type:: uv_rwlock_t
36
37 Read-write lock data type.
38
39 .. c:type:: uv_sem_t
40
41 Semaphore data type.
42
43 .. c:type:: uv_cond_t
44
45 Condition data type.
46
47 .. c:type:: uv_barrier_t
48
49 Barrier data type.
50
51
52 API
53 ---
54
55 Threads
56 ^^^^^^^
57
58 .. c:type:: uv_thread_options_t
59
60 Options for spawning a new thread (passed to :c:func:`uv_thread_create_ex`).
61
62 ::
63
64 typedef struct uv_thread_options_s {
65 enum {
66 UV_THREAD_NO_FLAGS = 0x00,
67 UV_THREAD_HAS_STACK_SIZE = 0x01
68 } flags;
69 size_t stack_size;
70 } uv_thread_options_t;
71
72 More fields may be added to this struct at any time, so its exact
73 layout and size should not be relied upon.
74
75 .. versionadded:: 1.26.0
76
77 .. c:function:: int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg)
78
79 .. versionchanged:: 1.4.1 returns a UV_E* error code on failure
80
81 .. c:function:: int uv_thread_detach(uv_thread_t* tid)
82
83 Detaches a thread. Detached threads automatically release their
84 resources upon termination, eliminating the need for the application to
85 call `uv_thread_join`.
86
87 .. versionadded:: 1.50.0
88
89 .. c:function:: int uv_thread_create_ex(uv_thread_t* tid, const uv_thread_options_t* params, uv_thread_cb entry, void* arg)
90
91 Like :c:func:`uv_thread_create`, but additionally specifies options for creating a new thread.
92
93 If `UV_THREAD_HAS_STACK_SIZE` is set, `stack_size` specifies a stack size for the new thread.
94 `0` indicates that the default value should be used, i.e. behaves as if the flag was not set.
95 Other values will be rounded up to the nearest page boundary.
96
97 .. versionadded:: 1.26.0
98
99 .. c:function:: int uv_thread_setaffinity(uv_thread_t* tid, char* cpumask, char* oldmask, size_t mask_size)
100
101 Sets the specified thread's affinity to cpumask, which is specified in
102 bytes. Optionally returning the previous affinity setting in oldmask.
103 On Unix, uses :man:`pthread_getaffinity_np(3)` to get the affinity setting
104 and maps the cpu_set_t to bytes in oldmask. Then maps the bytes in cpumask
105 to a cpu_set_t and uses :man:`pthread_setaffinity_np(3)`. On Windows, maps
106 the bytes in cpumask to a bitmask and uses SetThreadAffinityMask() which
107 returns the previous affinity setting.
108
109 The mask_size specifies the number of entries (bytes) in cpumask / oldmask,
110 and must be greater-than-or-equal-to :c:func:`uv_cpumask_size`.
111
112 .. note::
113 Thread affinity setting is not atomic on Windows. Unsupported on macOS.
114
115 .. versionadded:: 1.45.0
116
117 .. c:function:: int uv_thread_getaffinity(uv_thread_t* tid, char* cpumask, size_t mask_size)
118
119 Gets the specified thread's affinity setting. On Unix, this maps the
120 cpu_set_t returned by :man:`pthread_getaffinity_np(3)` to bytes in cpumask.
121
122 The mask_size specifies the number of entries (bytes) in cpumask,
123 and must be greater-than-or-equal-to :c:func:`uv_cpumask_size`.
124
125 .. note::
126 Thread affinity getting is not atomic on Windows. Unsupported on macOS.
127
128 .. versionadded:: 1.45.0
129
130 .. c:function:: int uv_thread_getcpu(void)
131
132 Gets the CPU number on which the calling thread is running.
133
134 .. note::
135 Currently only implemented on Windows, Linux and FreeBSD.
136
137 .. versionadded:: 1.45.0
138
139 .. c:function:: uv_thread_t uv_thread_self(void)
140 .. c:function:: int uv_thread_join(uv_thread_t *tid)
141 .. c:function:: int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2)
142
143 .. c:function:: int uv_thread_setname(const char* name)
144
145 Sets the name of the current thread. Different platforms define different limits on the max number of characters
146 a thread name can be: Linux, IBM i (16), macOS (64), Windows (32767), and NetBSD (32), etc. `uv_thread_setname()`
147 will truncate it in case `name` is larger than the limit of the platform.
148
149 Not supported on Windows Server 2016, returns `UV_ENOSYS`.
150
151 .. versionadded:: 1.50.0
152
153 .. c:function:: int uv_thread_getname(uv_thread_t* tid, char* name, size_t* size)
154
155 Gets the name of the thread specified by `tid`. The thread name is copied, with the trailing NUL, into the buffer
156 pointed to by `name`. The `size` parameter specifies the size of the buffer pointed to by `name`.
157 The buffer should be large enough to hold the name of the thread plus the trailing NUL, or it will be truncated to fit
158 with the trailing NUL.
159
160 Not supported on Windows Server 2016, returns `UV_ENOSYS`.
161
162 .. versionadded:: 1.50.0
163
164 .. c:function:: int uv_thread_setpriority(uv_thread_t tid, int priority)
165
166 If the function succeeds, the return value is 0.
167 If the function fails, the return value is less than zero.
168 Sets the scheduling priority of the thread specified by tid. It requires elevated
169 privilege to set specific priorities on some platforms.
170 The priority can be set to the following constants. UV_THREAD_PRIORITY_HIGHEST,
171 UV_THREAD_PRIORITY_ABOVE_NORMAL, UV_THREAD_PRIORITY_NORMAL,
172 UV_THREAD_PRIORITY_BELOW_NORMAL, UV_THREAD_PRIORITY_LOWEST.
173
174 .. c:function:: int uv_thread_getpriority(uv_thread_t tid, int* priority)
175
176 If the function succeeds, the return value is 0.
177 If the function fails, the return value is less than zero.
178 Retrieves the scheduling priority of the thread specified by tid. The value in the
179 output parameter priority is platform dependent.
180 For Linux, when schedule policy is SCHED_OTHER (default), priority is 0.
181
182 Thread-local storage
183 ^^^^^^^^^^^^^^^^^^^^
184
185 .. note::
186 The total thread-local storage size may be limited. That is, it may not be possible to
187 create many TLS keys.
188
189 .. c:function:: int uv_key_create(uv_key_t* key)
190 .. c:function:: void uv_key_delete(uv_key_t* key)
191 .. c:function:: void* uv_key_get(uv_key_t* key)
192 .. c:function:: void uv_key_set(uv_key_t* key, void* value)
193
194 Once-only initialization
195 ^^^^^^^^^^^^^^^^^^^^^^^^
196
197 Runs a function once and only once. Concurrent calls to :c:func:`uv_once` with the
198 same guard will block all callers except one (it's unspecified which one).
199 The guard should be initialized statically with the UV_ONCE_INIT macro.
200
201 .. c:function:: void uv_once(uv_once_t* guard, void (*callback)(void))
202
203 Mutex locks
204 ^^^^^^^^^^^
205
206 Functions return 0 on success or an error code < 0 (unless the
207 return type is void, of course).
208
209 .. c:function:: int uv_mutex_init(uv_mutex_t* handle)
210 .. c:function:: int uv_mutex_init_recursive(uv_mutex_t* handle)
211 .. c:function:: void uv_mutex_destroy(uv_mutex_t* handle)
212 .. c:function:: void uv_mutex_lock(uv_mutex_t* handle)
213 .. c:function:: int uv_mutex_trylock(uv_mutex_t* handle)
214 .. c:function:: void uv_mutex_unlock(uv_mutex_t* handle)
215
216 Read-write locks
217 ^^^^^^^^^^^^^^^^
218
219 Functions return 0 on success or an error code < 0 (unless the
220 return type is void, of course).
221
222 .. c:function:: int uv_rwlock_init(uv_rwlock_t* rwlock)
223 .. c:function:: void uv_rwlock_destroy(uv_rwlock_t* rwlock)
224 .. c:function:: void uv_rwlock_rdlock(uv_rwlock_t* rwlock)
225 .. c:function:: int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock)
226 .. c:function:: void uv_rwlock_rdunlock(uv_rwlock_t* rwlock)
227 .. c:function:: void uv_rwlock_wrlock(uv_rwlock_t* rwlock)
228 .. c:function:: int uv_rwlock_trywrlock(uv_rwlock_t* rwlock)
229 .. c:function:: void uv_rwlock_wrunlock(uv_rwlock_t* rwlock)
230
231 Semaphores
232 ^^^^^^^^^^
233
234 Functions return 0 on success or an error code < 0 (unless the
235 return type is void, of course).
236
237 .. c:function:: int uv_sem_init(uv_sem_t* sem, unsigned int value)
238 .. c:function:: void uv_sem_destroy(uv_sem_t* sem)
239 .. c:function:: void uv_sem_post(uv_sem_t* sem)
240 .. c:function:: void uv_sem_wait(uv_sem_t* sem)
241 .. c:function:: int uv_sem_trywait(uv_sem_t* sem)
242
243 Conditions
244 ^^^^^^^^^^
245
246 Functions return 0 on success or an error code < 0 (unless the
247 return type is void, of course).
248
249 .. note::
250 1. Callers should be prepared to deal with spurious wakeups on :c:func:`uv_cond_wait`
251 and :c:func:`uv_cond_timedwait`.
252 2. The timeout parameter for :c:func:`uv_cond_timedwait` is relative to the time
253 at which function is called.
254 3. On z/OS, the timeout parameter for :c:func:`uv_cond_timedwait` is converted to an
255 absolute system time at which the wait expires. If the current system clock time
256 passes the absolute time calculated before the condition is signaled, an ETIMEDOUT
257 error results. After the wait begins, the wait time is not affected by changes
258 to the system clock.
259
260 .. c:function:: int uv_cond_init(uv_cond_t* cond)
261 .. c:function:: void uv_cond_destroy(uv_cond_t* cond)
262 .. c:function:: void uv_cond_signal(uv_cond_t* cond)
263 .. c:function:: void uv_cond_broadcast(uv_cond_t* cond)
264 .. c:function:: void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex)
265 .. c:function:: int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout)
266
267 Barriers
268 ^^^^^^^^
269
270 Functions return 0 on success or an error code < 0 (unless the
271 return type is void, of course).
272
273 .. note::
274 :c:func:`uv_barrier_wait` returns a value > 0 to an arbitrarily chosen "serializer" thread
275 to facilitate cleanup, i.e.
276
277 ::
278
279 if (uv_barrier_wait(&barrier) > 0)
280 uv_barrier_destroy(&barrier);
281
282 .. c:function:: int uv_barrier_init(uv_barrier_t* barrier, unsigned int count)
283 .. c:function:: void uv_barrier_destroy(uv_barrier_t* barrier)
284 .. c:function:: int uv_barrier_wait(uv_barrier_t* barrier)