/* Page prose (es) */
"GuardAgainstReentrancy" = "# Cómo protegerse contra la reentrancia\n\nLa regla: **no dejes un punto de suspensión en medio de un invariante.** Dos formas prácticas de honrarla.\n\n**Mantén la comprobación y el cambio juntos, sin `await` entre ellos.** Haz cualquier espera *primero*, y luego comprueba-y-muta en una sola pasada síncrona que el actor no puede interrumpir:\n\n```swift\nfunc withdraw(_ amount: Int, by name: String) async -> Bool {\n    // Do the async work up front...\n    try? await Task.sleep(for: .seconds(1))   // e.g. approval\n\n    // ...then check and deduct with NO await between them.\n    guard balance >= amount else {\n        print(\"\\(name): denied (only \\(balance) available)\")\n        return false\n    }\n    balance -= amount\n    print(\"\\(name): withdrew \\(amount), balance now \\(balance)\")\n    return true\n}\n```\n\nAhora el `guard` y el `balance -= amount` se ejecutan uno tras otro sin una suspensión, así que ninguna otra tarea puede colarse entre ellos. Un retiro tiene éxito; el otro es denegado. Sin sobregiro.\n\n**O vuelve a comprobar después de cada `await`.** Si de verdad debes esperar en el medio, vuelve a leer el estado después de reanudar y vuelve a validar; nunca confíes en una instantánea previa al `await`:\n\n```swift\nguard balance >= amount else {\n    return false\n}\ntry? await Task.sleep(for: .seconds(1))\n// Re-check: the balance may have changed while we were suspended.\nguard balance >= amount else {\n    print(\"\\(name): denied on re-check\")\n    return false\n}\nbalance -= amount\n```\n\nAmbos enfoques comparten una idea: un actor protege cada acceso *individual*, pero un **invariante de varios pasos** (\"comprobar, luego actuar\") solo es seguro si ninguna suspensión lo parte. La reentrancia es una característica (evita que los actores se interbloqueen mientras esperan), pero significa que debes razonar sobre qué puede cambiar a través de cada `await`.\n\n[Anterior](@previous)  |  página 5 de 7  |  [Siguiente: Sendable, brevemente](@next)";
