/* Page prose (es) */
"Deadlock" = "# Interbloqueo: esperarte a ti mismo, para siempre\n\nUn **interbloqueo** es cuando el trabajo se detiene de forma permanente porque las tareas se esperan unas a otras en círculo, y nadie puede avanzar. La versión más simple solo necesita una cola y una palabra: `sync`.\n\nRecuerda que `sync` significa *\"ejecuta este bloque y no retornes hasta que haya terminado.\"* Ahora, el congelamiento clásico. Ejecutando en el hilo principal, hacemos `sync` sobre la cola principal:\n\n```swift\n// ⚠️ DO NOT RUN THIS: it deadlocks the main thread forever.\nimport Foundation\n\nDispatchQueue.main.sync {\n    print(\"This line never runs.\")\n}\n```\n\nSigue la lógica:\n\n1. Estás en el hilo principal. Llamas a `main.sync { ... }`.\n2. `sync` dice: \"Esperaré aquí mismo hasta que ese bloque termine.\"\n3. Pero el bloque está programado para ejecutarse en la **cola principal**, que es justo el hilo ahora congelado dentro de `sync`, esperando.\n4. El hilo principal espera al bloque; el bloque no puede empezar hasta que el hilo principal esté libre. Ninguno cede jamás. **Congelado.**\n\nEsa es una espera circular con un único participante. La misma trampa salta siempre que haces `sync` sobre **una cola serial en la que ya te estás ejecutando**:\n\n```swift\n// ⚠️ DO NOT RUN THIS EITHER: same deadlock, different disguise.\nimport Foundation\n\nlet ledger = DispatchQueue(label: \"ledger\")   // serial\n\nledger.sync {\n    // We are now running *on* ledger...\n    ledger.sync {          // ...and we ask it to run something and wait.\n        print(\"Unreachable.\")   // ledger is busy with us. Circular wait.\n    }\n}\n```\n\nEjecutamos el ejemplo con carrera en vivo porque un número equivocado es inofensivo. **No** estamos ejecutando estos, porque un interbloqueo no imprime nada; solo deja colgada la página del Playground hasta que la detienes manualmente. Esa es exactamente la razón por la que la regla merece memorizarse:\n\n**Nunca llames a `sync` apuntando a la cola en la que ya estás. En particular, nunca `DispatchQueue.main.sync` desde el hilo principal.**\n\n`async` no tiene este problema: entrega el bloque y retorna de inmediato, así que no hay nadie parado esperando. Cuando necesitas rebotar de vuelta a la cola principal para actualizar la UI, es `DispatchQueue.main.async`, siempre.\n\n[Anterior](@previous)  |  página 6 de 9  |  [Siguiente: Inversión de prioridad](@next)";
