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:
- suddivisione della proprietà delimitata
channel_sender<t>/channel_receiver<t>; - non bloccante
try_send/try_recve blocco supportato dallo schedulersend/recv; - digitato one-shot
task_sender<t>/task_handle<t>si unisce; - eventi e coppie di cancellazioni;
- waitgroup, semafori, barriere, variabili di condizione e blocchi.
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.