/* Page prose (es) */
"SemaphoreAsLock" = "# Un semáforo de 1 como cerrojo (y por qué desconfiar)\n\nPon la cuenta a **1** y un semáforo se convierte en un **cerrojo**, una puerta que solo una tarea puede cruzar a la vez. Todo lo que está entre `wait()` y `signal()` es una **sección crítica**: código que debe ejecutarse sin que otro hilo lo interrumpa.\n\n¿Por qué necesitarías eso? Porque dos tareas tocando la misma variable a la vez pueden corromperla. El código de abajo tiene 500 tareas que cada una incrementa un conteo compartido.";
"SemaphoreAsLock-2" = "**Míralo en acción:** obtienes `500`, siempre.\n\n* callout(Pruébalo): Comenta las líneas `lock.wait()` y `lock.signal()` y ejecútalo unas cuantas veces. Obtendrás un número *menor* que 500, y uno distinto en cada ejecución. Eso es una **carrera de datos**: sin el cerrojo, varias tareas leen el mismo valor de `seen`, cada una suma uno, y cada una escribe el mismo resultado de vuelta, así que esos incrementos colapsan en uno solo. El cerrojo obliga a que la lectura y la escritura ocurran como una sola unidad, así que no se pierde ninguna actualización.\n\nEsto funciona, pero recurre a ello con cuidado. Un semáforo de cuenta 1 tiene la misma contabilidad frágil que `enter`/`leave`: olvida un `signal()` en un camino de error y todas las demás tareas esperan para siempre (un **interbloqueo**). Además bloquea hilos reales mientras hacen cola. Para la exclusión mutua simple hay herramientas más ligeras y seguras (una cola serial, o `NSLock`), y la respuesta moderna de Swift, los **actores**, convierte este tipo de protección de estado compartido en una característica del lenguaje que no puedes olvidarte de equilibrar. Verás la carrera de frente en el siguiente capítulo, y los actores más adelante en el libro. Por ahora, solo debes saber: un semáforo *puede* ser un cerrojo, pero \"cerrojo\" no es su mejor trabajo.\n\n[Anterior](@previous)  |  página 7 de 8  |  [Siguiente: Resumen](@next)";
