sync.Map en Go: del API pública a la implementación con hash trie

sync.Map es la estructura de la biblioteca estándar de Go diseñada para acceder a un mapa desde varias goroutines sin provocar carreras de datos, un problema habitual cuando un mapa normal es leído y escrito de forma concurrente. Tras explicar por qué un map[K]T corriente no es seguro ante accesos s

Reproducen una vulnerabilidad de SQLite de dieciséis años en el WAL

Un artículo técnico de The Consensus reproduce y documenta una vulnerabilidad latente durante dieciséis años en el sistema de registro write-ahead log (WAL) de SQLite. El fallo, bautizado como "WAL-Reset bug", se origina en una condición de carrera durante los checkpoints concurrentes: una lectura o

Carreras de datos y el modelo de memoria en Go

En Go, escribir un valor en una goroutine y leerlo desde otra puede parecer correcto cuando el programa imprime el resultado esperado, pero el lenguaje no garantiza que una escritura sea visible para otra goroutine sin sincronización explícita. Este artículo analiza por qué un ejemplo aparentemente

Goroutines 101: guía básica de concurrencia en Go

Go destaca frente a Java, Python o Erlang por simplificar la concurrencia a una sola palabra clave: `go`. Una goroutine es una función que el runtime de Go ejecuta en paralelo con el resto del programa, sin que el desarrollador tenga que crear hilos, dimensionar pools ni instalar librerías. El artí

Se acabó el almuerzo gratis: el giro hacia la concurrencia en el software

Herb Sutter describe en este artículo de fondo, publicado originalmente en Dr. Dobb's Journal en 2005 y actualizado en 2009, el cambio más importante en el desarrollo de software desde la revolución orientada a objetos: el fin de las mejoras gratuitas de rendimiento y el giro forzoso hacia la concur

Semáforos en C++20: control de concurrencia y señalización entre hilos

El estándar C++20 incorporó al lenguaje dos tipos de semáforos pensados para resolver problemas clásicos de concurrencia que un mutex no cubre con soltura: std::counting_semaphore y std::binary_semaphore. Este artículo explica, con ejemplos prácticos en C++23, cómo utilizarlos para limitar el número

Por qué más paralelismo puede ralentizar las bases de datos

PlanetScale documenta una caída de producción de dieciséis minutos sufrida por una base de datos MySQL para explicar por qué aumentar la concurrencia puede reducir el rendimiento en lugar de mejorarlo. El incidente lo provocó un trabajo por lotes que abrió una transacción sobre una tabla activa y re

Diseñando el sistema de consultas de Krabby: objetivos y arquitectura

El autor describe el proceso de cinco meses para diseñar el sistema de consultas del compilador Krabby, inicialmente planteado con una arquitectura push que acabó descartada. Las principales limitaciones del modelo push eran que, al gestionar referencias pendientes, terminaba siendo un sistema de co

ByteAtomic de iceoryx2: primitivas lock-free seguras contra carreras de datos

iceoryx2, biblioteca de comunicación entre procesos orientada a sistemas críticos de seguridad y alta fiabilidad, incorpora ByteAtomic, un envoltorio que permite copiar memoria de forma atómica a nivel de byte. La pieza resuelve un problema conocido en Rust y C++: los sequence locks, que evitan bloq

Katharos: una biblioteca de programación funcional y concurrencia para Python

Katharos es una biblioteca de Python que combina abstracciones algebraicas —Functor, Applicative, Monad, Semigroup y Monoid— con tipos de datos inmutables y un modelo de concurrencia por paso de mensajes, todo bajo una misma idea: modelar errores, efectos y comunicación concurrente como valores comp

Concurrencia, interactividad y mutabilidad: solo puedes elegir dos

En ingeniería de software existe un compromiso difícil de resolver: no se pueden mantener a la vez la concurrencia, la interactividad y la mutabilidad de los datos sin pagar un precio considerable. Cada una de estas propiedades resuelve un problema real. La concurrencia permite ejecutar varios hilos

SQLite en producción: cómo ajustar WAL, concurrencia y VFS para baja latencia

SQLite, concebido históricamente como base de datos embebida para móviles, IoT o entornos de desarrollo, puede comportarse como un motor de producción de alto rendimiento si se ajusta de forma adecuada. El artículo desgrana los cuatro ejes clave de esa optimización: el modo Write-Ahead Logging (WAL)

Colas MPSC sin bloqueos para io_uring en el kernel 7.2

El subsistema io_uring del kernel Linux gestiona un volumen elevado de operaciones en vuelo, lo que exige estructuras de datos eficientes para sus colas internas de trabajo. Hasta la versión 7.1, io_uring se apoyaba en la API llist del kernel, una lista simplemente enlazada sin bloqueos orientada a

Tokio ofrece progreso, no orden: cómo programar un millón de tareas

En servicios escritos en Rust con Tokio, los autores suelen asumir que las tareas lanzadas antes terminarán antes. Esta premisa se rompe cuando se generan ráfagas masivas de tareas cortas, como ocurre en flujos basados en eventos donde cada evento lanza hasta mil tareas para procesar tokens de usuar

Construir una cola lock-free rápida en C++ moderno desde cero

Las colas son una de las estructuras de datos más usadas en informática, y en código de un solo hilo su implementación resulta trivial: basta con std::queue en C++. La complejidad surge al pasar a entornos multihilo, donde varios hilos compiten por los mismos elementos y, si no se sincronizan correc

El modo WAL de SQLite puede bloquear a lectores de corta duración

El modo WAL (Write-Ahead Logging) de SQLite se presenta a menudo como la solución al clásico error "database is locked", junto con un tiempo de espera de ocupado y transacciones BEGIN IMMEDIATE para escrituras. Sin embargo, este artículo técnico explica por qué esa combinación puede fallar en una ca

Cómo resolver el puzzle de concurrencia de Papá Noel con un model checker

Este artículo explica cómo resolver el clásico problema de sincronización conocido como el puzzle de Papá Noel utilizando verificación formal mediante el model checker SPIN y el lenguaje de especificación Promela. El puzzle plantea que Papá Noel permanece dormido hasta ser despertado por los nueve r

Concurrencia al estilo Go implementada en C con pthreads

El lenguaje Go debe gran parte de su atractivo a su modelo de concurrencia: las goroutines, los canales y un planificador en tiempo de ejecución que permite ejecutar miles de tareas ligeras sobre unos pocos hilos del sistema operativo. En C, sin embargo, no existe nada equivalente de fábrica. Este a

Diseñan una cola MPMC rápida con espera acotada para hilos concurrentes

Este artículo describe el diseño y la implementación de una cola de acceso concurrente pensada para comunicar múltiples productores con múltiples consumidores (MPMC, por sus siglas en inglés) en memoria compartida. El autor parte de su interés por las estructuras de datos sin bloqueos y propone una

Swarm: framework de orquestación de agentes escrito íntegramente en Swift 6.2

Swarm es un framework de orquestación de agentes implementado por completo en Swift 6.2 y distribuido como paquete Swift, con compatibilidad para macOS, iOS y Linux. Su objetivo es permitir a los desarrolladores definir agentes y flujos de trabajo con tipado fuerte, aprovechando las primitivas del l

Flow: lenguaje de programación con concurrencia basada en actores para C++11

Flow es el lenguaje de programación creado por el equipo de FoundationDB para introducir concurrencia basada en actores en C++11, dentro de los retos de ingeniería que afronta el proyecto: alto rendimiento por nodo, escalabilidad y tolerancia a fallos mediante simulación extensiva. Está implementado

Trabajo de fin de grado documenta la arquitectura interna de GNU Emacs

Un trabajo de fin de grado del Programa de Bachelor en Informática de la Universidad de Uppsala, elaborado por Erik J. Karlsson y fechado el 18 de marzo de 2026, se propone llenar un vacío en la documentación del editor de texto GNU Emacs: la ausencia de material accesible sobre su arquitectura inte

Benchmark en Go: un mapa fragmentado con 256 cerrojos supera al resto

Este artículo presenta una comparativa exhaustiva de seis diseños de caché en memoria (pares clave-valor de cadenas) implementados exclusivamente con la biblioteca estándar de Go y evaluados con pruebas de rendimiento. Los diseños comparados son: un mapa plano sin protección (no seguro), un mapa con

Gossamer: un lenguaje de sistemas con sabor a Rust y goroutines reales

Gossamer es un lenguaje de programación de código abierto, publicado bajo licencia Apache-2.0, que combina una sintaxis expresiva inspirada en Rust con características propias de Go, como las goroutines y los canales tipados. Se ejecuta sobre una máquina virtual de bytecode con REPL para iterar con

Tiny: un lenguaje de programación concurrente con compilador JIT

Tiny es un lenguaje de programación y sistema de tiempo de ejecución de alto rendimiento, concurrente y escrito en Go. Combina la agilidad de un lenguaje dinámico con un motor de ejecución multihilo, y está dirigido a desarrolladores que necesitan prototipar con rapidez sin renunciar a velocidad de

Por qué las colas no solucionan la sobrecarga y qué hacer en su lugar

## Por qué las colas no solucionan la sobrecarga y qué hacer en su lugar ### Lead En el mundo del software, cuando un sistema se enfrenta a un pico de tráfico, la respuesta instintiva suele ser la misma: aumentar el tamaño de las colas, añadir un buffer o incorporar un sistema de mensajería como K

Rust para programadores de Python: guía completa de formación

Esta guía de formación titulada 'Rust for Python Programmers: Complete Training Guide' está dirigida a desarrolladores con experiencia en Python que quieran aprender Rust, el lenguaje de sistemas con tipado estático y seguridad de memoria garantizada en tiempo de compilación. El material parte de la

Lecciones de orquestar 100.000 sandboxes concurrentes

Scale, una empresa de evaluación de infraestructura en la nube, pospuso la publicación de los resultados de su "Scale Invitational" del 8 al 17 de junio tras descubrir, durante el diseño de la prueba, problemas de fondo que invalidaban sus primeras mediciones. El benchmark busca comparar proveedores

Blorp: un lenguaje de programación seguro y eficiente que compila a C

Blorp es un nuevo lenguaje de programación diseñado para combinar la seguridad y expresividad de los lenguajes modernos con el rendimiento nativo de C. Compila directamente a C, lo que permite que el código Blorp se ejecute con una eficiencia cercana a la del código C escrito a mano. Sus principales

ClickHouse presenta Silk: nuevo planificador de fibras para Linux

Silk es un planificador de fibras cooperativas para Linux desarrollado por ClickHouse, diseñado para ofrecer alto rendimiento y concurrencia eficiente en sistemas modernos. Las fibras son corutinas de pila ligera que suspenden en lugar de bloquear sus hilos del sistema operativo, permitiendo concurr

Singleflight: cómo Go elimina el trabajo redundante en sistemas concurrentes

Singleflight es una librería del ecosistema Go (ubicada en golang.org/x/sync/singleflight) que resuelve un problema común en aplicaciones concurrentes: cuando múltiples gorutinas solicitan el mismo recurso simultáneamente, en lugar de ejecutar la operación repetidas veces, singleflight garantiza que

Rust: ¿Propiedad o Conteo de Referencias?

Rust, conocido por su seguridad de memoria sin necesidad de un recolector de basura, logra esto a través de un sistema de propiedad riguroso. Sin embargo, este sistema tiene una 'válvula de escape': el conteo de referencias. Normalmente, cada valor en Rust tiene un único propietario, y cuando ese pr

Contador distribuido: desafío en Fly.io

Este artículo explora un desafío específico dentro de una serie sobre sistemas distribuidos en Fly.io: la construcción de un contador de crecimiento (grow-only counter) utilizando un servicio de almacenamiento clave-valor secuencialmente consistente (SeqKV) de Maelstrom. El objetivo es crear un cont

Clojure: del código a la infraestructura de Nubank

El documental "Documental" explora la historia de Clojure, un lenguaje de programación funcional que ha evolucionado desde una idea inicial hasta convertirse en la base de la infraestructura de ingeniería de Nubank, uno de los mayores bancos digitales independientes del mundo. Clojure no es un lengu

Go: Nuevo sistema de logs con buffer circular

El artículo de Alex Rios, "Construyendo slogbox", explora la implementación de un manejador de logs (`slog.Handler`) en Go que utiliza un buffer circular (ring buffer) para almacenar los últimos registros de logs. La motivación surge de la necesidad de tener acceso a logs recientes para fines de mon

Surelock: Nueva Biblioteca Rust Evita Bloqueos de Código

Desarrolladores de Rust han presentado 'Surelock', una nueva biblioteca diseñada para eliminar los bloqueos (deadlocks) en el código. Los bloqueos, difíciles de detectar y que pueden causar fallos inesperados en sistemas, son un problema común en la programación concurrente. Surelock aborda este pro

Rust: Compartir datos mutables de forma segura

Este artículo de Alice Ryhl explica cómo compartir estados mutables en Rust, un concepto crucial para aplicaciones concurrentes, tanto síncronas como asíncronas. El problema fundamental es permitir que múltiples hilos (threads) modifiquen el mismo dato de forma segura, evitando condiciones de carrer

Lisette: Nuevo lenguaje fusiona Rust y Go

Lisette es un nuevo lenguaje de programación diseñado para ser sintácticamente similar a Rust pero con un runtime de Go. Su objetivo principal es ofrecer una alternativa que combine la seguridad y expresividad de Rust con la interoperabilidad y el ecosistema maduro de Go. Esto se logra a través de u

Python Async: ¿Determinista? El desafío revelado

El artículo de dbos.dev explora un desafío crucial al desarrollar bibliotecas de ejecución duradera en Python: cómo lograr la determinancia en flujos de trabajo asíncronos. La asincronía, aunque mejora el rendimiento al permitir la ejecución concurrente de tareas (por ejemplo, usando `asyncio.gather

Unity: La 'hack' de corrutinas revelada

Un artículo explora el uso de corrutinas en C++ y cómo Unity, en C#, ha implementado una solución ingeniosa debido a limitaciones históricas en el soporte de `await` en C#. Inicialmente, las corrutinas de C++ han sido poco utilizadas debido a su complejidad y la falta de ejemplos concretos. El artíc

SBCL: Hilos Ligeros Mejoran la Concurrencia

Este documento describe una implementación de hilos cooperativos ligeros (fibers) para SBCL, una implementación de Common Lisp. El objetivo principal es proporcionar una alternativa eficiente a los hilos del sistema operativo (OS) para manejar aplicaciones concurrentes, especialmente aquellas con ca

Aislamiento en Erlang: ¿Solución o Limitación?

Este artículo explora las limitaciones del modelo de concurrencia basado en aislamiento, utilizando Erlang como ejemplo paradigmático. Erlang, conocido por su robustez y alta disponibilidad (como se evidencia en sistemas como WhatsApp), implementa un modelo de 'actores' donde cada proceso tiene su p

Kovan: Nueva Biblioteca Rust para Gestión de Memoria

Este artículo del blog de vertexclique.com introduce Kovan, una nueva biblioteca de Rust diseñada para abordar un problema crítico en sistemas concurrentes de alto rendimiento: la recolección de memoria wait-free. El problema surge al usar estructuras de datos lock-free, como las proporcionadas por

Futuros bloqueados: un problema oculto en Rust

El artículo "Never snooze a future" aborda un problema sutil pero crítico en la programación asíncrona en Rust: el "snoozing" de futures. En esencia, el snoozing ocurre cuando un futuro está listo para avanzar (es decir, tiene trabajo por hacer) pero no es "polled" (interrogado) por el executor (el

Cómo funciona el planificador de Go

El sistema de planificación (scheduler) de Go es un componente crucial del runtime que gestiona la ejecución concurrente de goroutines, que son funciones ligeras que pueden ejecutarse simultáneamente. Dado que el número de goroutines puede superar con creces el número de núcleos de CPU disponibles,

Go: Contextos cancelados, ahora con más detalles

En Go, los errores de contexto cancelado o vencido son comunes, pero a menudo carecen de información crucial sobre la causa subyacente. Esto dificulta la depuración y la respuesta a incidentes en producción. El artículo aborda este problema, introduciendo las funciones `WithCancelCause` (Go 1.20) y

Scala: Concurrencia optimizada con técnica inspirada en Haskell

Este artículo explora una técnica avanzada para mejorar la concurrencia en Scala, inspirada en el lenguaje Haskell y su biblioteca Haxl. El problema que aborda es cómo optimizar la ejecución de múltiples consultas de datos, evitando una serie de llamadas secuenciales a la base de datos. En Haskell,

Python Asyncio: Errores comunes al compartir estado

Este artículo del blog de Inngest explora un problema común en Python asyncio: la coordinación de tareas concurrentes que comparten estado. La biblioteca estándar ofrece `asyncio.Event` y `asyncio.Condition`, pero ambos tienen limitaciones que se manifiestan bajo presión de concurrencia real. El art

Flujos de trabajo nativos en Go: un desafío resuelto

Este artículo de DBOS.dev explora cómo construir una biblioteca de flujos de trabajo en Go que se sienta natural y familiar para los desarrolladores de Go, abordando las limitaciones inherentes al lenguaje en este tipo de tareas. El desafío principal radica en combinar la potencia de Go (soporte par

Sistemas concurrentes: ¿por qué Erlang sigue siendo clave?

Este artículo de Variant Systems explora por qué los sistemas basados en procesos, como los que utiliza Erlang/Elixir (BEAM y OTP), siguen siendo relevantes y efectivos en la construcción de sistemas concurrentes y distribuidos, especialmente en el contexto de la inteligencia artificial y los agente

Asignador de memoria en Go: cómo funciona

El artículo "The Memory Allocator" de internals-for-interns.com explica cómo funciona el asignador de memoria del runtime de Go, un componente crucial para el rendimiento y la eficiencia del lenguaje. Imagina al asignador como un 'administrador de almacenes': Go necesita 'cajas' (memoria) de diferen

Lecturas bloqueadas: ¿el cuello de botella oculto?

Este artículo explora una paradoja contraintuitiva en la programación concurrente: en ciertas situaciones, las lecturas bloqueadas (read locks) pueden ser *más lentas* que las escrituras bloqueadas (write locks). El autor, al optimizar una caché de tensores de alto rendimiento llamada Redstone en Ru

Go 1.24: sync.Map optimizado con nueva estructura

A partir de Go 1.24, la implementación interna de `sync.Map` en la biblioteca estándar de Go ha sido rediseñada para mejorar el rendimiento de la concurrencia, utilizando ahora una estructura llamada HashTrieMap. Esta estructura combina una tabla hash con un trie, permitiendo lecturas sin bloqueo (l

C++17: Optimiza el acceso concurrente con shared_mutex

Este artículo explica `std::shared_mutex`, una herramienta valiosa introducida en C++17 que optimiza el acceso concurrente a datos compartidos, especialmente en escenarios de lectura intensiva. Comienza con un ejemplo básico: un contador que se incrementa y se lee por múltiples hilos, utilizando `st

Rust en GPU: Async/await facilita la programación

VectorWare ha anunciado un hito significativo en la programación de GPU: la capacidad de utilizar las características `async/await` de Rust directamente en la GPU. Esto representa un avance importante hacia la visión de la empresa de facilitar a los desarrolladores la creación de aplicaciones de alt

PostgreSQL: Fallos silenciosos en datos financieros

Un artículo de lirbank.com advierte sobre una vulnerabilidad común en bases de datos PostgreSQL que puede llevar a errores financieros silenciosos. Estas 'condiciones de carrera' ocurren cuando dos transacciones concurrentes leen el mismo valor (por ejemplo, el saldo de una cuenta), lo calculan inde

Discord Revela Secretos de su Escalabilidad

Este artículo de Fullstack.zip analiza cómo Discord, una plataforma de comunicación popular, logra su rendimiento, escalabilidad y fiabilidad a gran escala, soportando billones de mensajes. La clave de su arquitectura reside en el uso del **Modelo de Actor**, un patrón de diseño que ha evolucionado

Rust: Hibana asegura protocolos con nuevos tipos de sesión

Hibana es un proyecto innovador para Rust que introduce el concepto de *Tipos de Sesión Multipartita Afines* (Affine Multiparty Session Types - MPST) para garantizar la corrección y seguridad de protocolos de comunicación a nivel de compilador. En esencia, permite que el compilador Rust *pruebe* que

Go: Nueva librería facilita la depuración de bloqueos

Desarrolladores de Go han lanzado 'deadlog', una nueva biblioteca diseñada para simplificar la depuración de bloqueos de mutex, un problema común en aplicaciones concurrentes. La biblioteca, disponible en GitHub, permite a los programadores reemplazar `sync.Mutex` y `sync.RWMutex` con `deadlog.Mutex

Microsoft crea índice más eficiente para bases de datos

La noticia describe BF-Tree, una nueva estructura de índice desarrollada por Microsoft Research que busca optimizar el rendimiento de las bases de datos al reducir la amplificación de escritura y el desperdicio de memoria. BF-Tree reemplaza el almacenamiento en página tradicional de 4KB con mini-pág