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 artículo explora hasta qué punto es posible reproducir ese modelo usando únicamente hilos POSIX (pthreads), y con qué costes y compromisos.
El autor llega a estas cuestiones mientras desarrolla Solod (So), un subconjunto estricto de Go que se traduce a C plano sin runtime ni recolector de basura. Para su pila de concurrencia, parte de dos primitivas POSIX básicas: el mutex (pthread_mutex_t) y la variable de condición (pthread_cond_t). Sobre ellas construye Mutex, Cond, operaciones atómicas (Bool, Int32, Int64, Uint32, Uint64 y Pointer[T]) que mapean directamente a los builtins __atomic del compilador de C, Once, un tipo Thread que envuelve pthread_t, y un Pool de trabajadores para reutilizar hilos y evitar el coste de crearlos y destruirlos en cada tarea. También define un tipo Channel inspirado en los canales de Go, construido igualmente con un mutex y variables de condición.
El artículo detalla el rendimiento medido: las operaciones atómicas igualan a las de Go (2 ns en Load y Store, 13 ns en CompareAndSwap), mientras que los canales son entre 4 y 16 veces más lentos que en Go debido al contexto de sincronización adicional. La conclusión es que se puede conseguir mucho con pthreads —toda la pila de sincronización cabe en unas pocas decenas de líneas de C—, siempre que se asuman las limitaciones: los hilos del sistema operativo son caros (cada uno necesita su propia pila), no hay reasignación automática de stacks como en las goroutines, y un uso descuidado puede degradar el rendimiento. Está orientado a programadores de C y de sistemas que necesiten concurrencia estructurada sin renunciar al control de bajo nivel, y especialmente a quienes trabajen con So o quieran移植ar patrones de Go a C.
