Simultaneidad estructurada

seed usos estructurados spawn, mecanografiado ordinario task/synchronization bibliotecas y un tiempo de ejecución alojado M:N. no tiene async/await o funciones coloreadas.

engendrar

fn compute(value: i64) {
    spawn {
        let answer = value + 1
    }
}

El compilador delinea el cuerpo en un trabajador interno y crea un entorno de captura copy/move concreto. Cada borde que sale del alcance léxico propietario espera a su grupo de tareas antes de la limpieza, por lo que una tarea no puede sobrevivir accidentalmente al estado stack/region capturado.

Las capturas requieren send; El acceso simultáneo compartido también requiere sync. Mantener el original mientras se envía un recurso requiere una clonación explícita. El estado global mutable no se puede capturar, directamente ni a través de un ayudante. Postfix ? no puede cruzar el límite de la tarea mientras los cuerpos de la tarea devuelven void.

Biblioteca de tareas

compiler/llvm/libs/task es un paquete genérico ordinario. Proporciona:

Import/source-elide ese paquete antes de usar estos tipos. El lenguaje en sí no define chan<t>, send, recv, canales de encuentro, desove independiente o spawn for sintaxis.

Programador

Linux-native x86-64/AArch64 proporciona programadores estructurados sin libc. Bloquear el parque de operaciones de la biblioteca de tareas a través del contrato de tiempo de ejecución en lugar de fijar a un trabajador. Los registros de tareas llevan el contexto del asignador activo; El trabajo vinculado a la región se une antes del lanzamiento de la región.

Windows x86-64 utiliza CreateThread con uniones de grupos léxicos y biblioteca de tareas channel/join ejecución, cubierta por la ejecución Wine requerida. el macOS x86-64 y brazo64 runtime/link las superficies utilizan la programación pthread; Intel nativo x86-64 la ejecución sigue siendo la Gate 14 elemento de cierre, mientras que arm64 es explícitamente de enlace cruzado únicamente.

Resultados de tareas escritas

task_result_new<t, e>(), task_result_complete_ok/error, y task_result_wait especializar los puntos finales lineales de un solo disparo sobre result<t,e>. El éxito y el fracaso se componen sin async/await; el identificador sigue siendo de solo movimiento, el bloqueo es explícito, las capturas aún requieren sendy los identificadores respaldados por regiones no pueden escapar de su región. Esta es la superficie de una biblioteca, así que spawn sigue siendo pequeño y los costos de las tareas siguen siendo visibles.