Declaraciones públicas de src/sync.zig (zkit (SDK consumido)).
apps/docs/generated/zig/zkit.jsonPágina generada desde
zkit@zkit-0.0.0-_fk2iAa4BQCqGFKJeeY9WvMQClX5kiZQ2iOZrVsxVyyN (src/root.zig). No se edita a mano:bun run docs:genla regenera ybun run docs:checkfalla si difiere.
zkit/sync — Mutex y Condition bloqueantes sobre pthread, sin runtime Io.
Desde 0.16 std.Thread.Mutex/Condition no existen: el mutex bloqueante
vive en std.Io.Mutex y exige un Io. Una librería con hilos propios
(std.Thread.spawn) no tiene uno, así que cada consumidor escribió su capa
pthread (styx: backpressure_waker.zig más 60 usos de pthread_mutex_t
crudo; hyperdiff: watch/sync.zig). Ésta es la única.
Diseño:
.{} = PTHREAD_*_INITIALIZER):
no hay init que olvidar ni error.MutexInitFailed que propagar. El
deinit existe para simetría y es opcional sobre un mutex estático.lock/unlock/wait sólo fallan por bugs (EINVAL, EDEADLK, EPERM):
se promueven a pánico, nunca se ignoran.timedWait mide contra el reloj MONOTÓNICO siempre que la plataforma
lo permita (glibc ≥ 2.30 pthread_cond_clockwait, Darwin
pthread_cond_timedwait_relative_np); un salto del reloj de pared no
alarga ni acorta la espera. En musl / BSD cae a CLOCK_REALTIME, y el
bucle de waitUntil recorta contra el plazo monotónico igualmente.Para detectar inversiones de orden de locks y unlocks desde otro hilo usa
zkit.safety.Mutex, que envuelve éste.
sync.Mutextype · línea 54
pub const Mutex = structMutex no recursivo con atributos por defecto.
sync.Mutex.deinitfn · línea 57
pub fn deinit(m: *Mutex) voidSin ///.
sync.Mutex.lockfn · línea 62
pub fn lock(m: *Mutex) voidSin ///.
sync.Mutex.tryLockfn · línea 70
pub fn tryLock(m: *Mutex) booltrue si el lock se tomó; false si otro hilo lo tiene.
sync.Mutex.unlockfn · línea 78
pub fn unlock(m: *Mutex) voidSin ///.
sync.Mutex.acquirefn · línea 86
pub fn acquire(m: *Mutex) HeldGuarda para defer: var held = m.acquire(); defer held.release();.
sync.Mutex.Heldtype · línea 91
pub const Held = structSin ///.
sync.Mutex.Held.releasefn · línea 94
pub fn release(self: Held) voidSin ///.
sync.TimedWaitErrorconst · línea 100
pub const TimedWaitError = error{Timeout}Sin ///.
sync.Conditiontype · línea 105
pub const Condition = structVariable de condición. Se asocia a un Mutex en cada wait.
Los despertares espurios son posibles: el llamador re-comprueba su
predicado en bucle.
sync.Condition.deinitfn · línea 108
pub fn deinit(cond: *Condition) voidSin ///.
sync.Condition.waitfn · línea 115
pub fn wait(cond: *Condition, mutex: *Mutex) voidLibera mutex (que el llamador sostiene), duerme hasta una señal y lo
vuelve a tomar antes de volver.
sync.Condition.timedWaitfn · línea 124
pub fn timedWait(cond: *Condition, mutex: *Mutex, timeout_ns: u64) TimedWaitError!voidComo wait, pero como mucho timeout_ns. error.Timeout si venció
sin señal. Puede volver antes (despertar espurio) sin error.
sync.Condition.waitUntilfn · línea 129
pub fn waitUntil(cond: *Condition, mutex: *Mutex, deadline: time.Deadline) TimedWaitError!voidComo wait, hasta el plazo monotónico deadline.
sync.Condition.signalfn · línea 156
pub fn signal(cond: *Condition) voidDespierta al menos a un hilo en espera.
sync.Condition.broadcastfn · línea 164
pub fn broadcast(cond: *Condition) voidDespierta a todos los hilos en espera.