Concorrenza strutturata

seed usi strutturati spawn, digitato ordinario task/synchronization librerie e un runtime ospitato M:N. Non ha async/await o funzioni colorate.

Generare

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

Il compilatore delinea il corpo in un lavoratore interno e crea un ambiente di acquisizione copy/move concreto. Ogni bordo che lascia l'ambito lessicale proprietario attende il proprio gruppo di attività prima della pulizia, quindi un'attività non può sopravvivere accidentalmente allo stato stack/region catturato.

Le acquisizioni richiedono send; l'accesso simultaneo condiviso richiede inoltre sync. Mantenere l'originale durante l'invio di una risorsa richiede un clone esplicito. Lo stato globale mutevole non può essere catturato, direttamente o tramite un aiutante. Il suffisso ? non può oltrepassare il limite dell'attività mentre i corpi dell'attività restituiscono void.

Libreria di attività

compiler/llvm/libs/task è un pacchetto generico ordinario. Fornisce:

Import/source-elide quel pacchetto prima di utilizzare questi tipi. La lingua stessa non definisce chan<t>, send, recv, canali di incontro, spawn distaccati o spawn for sintassi.

Pianificatore

Linux-nativo x86-64/AArch64 fornisce scheduler strutturati senza libc. Il blocco delle operazioni della libreria attività parcheggia tramite il contratto di runtime invece di bloccare un lavoratore. I record delle attività portano il contesto dell'allocatore attivo; Join di lavoro legati alla regione prima del rilascio della regione.

Windows x86-64 utilizza CreateThread con join di gruppi lessicali e libreria di attività channel/join esecuzione, coperta dall'esecuzione Wine richiesta. Il macOS x86-64 e arm64 runtime/link le superfici utilizzano la pianificazione pthread; Intel nativo x86-64 l'esecuzione resta la Gate 14, mentre arm64 è esplicitamente solo cross-link.

Risultati delle attività digitate

task_result_new<t, e>(), task_result_complete_ok/error, e task_result_wait specializzare gli endpoint lineari one-shot result<t,e>. Successo e fallimento si compongono senza async/await; la maniglia rimane di solo spostamento, il blocco è esplicito, le acquisizioni richiedono ancora sende gli handle con supporto della regione non possono sfuggire alla rispettiva regione. Questa è una superficie della biblioteca, quindi spawn rimane piccolo e i costi delle attività rimangono visibili.