xxc

可编译可解释的系统级语言 - 确定性 ARC 无 GC / 全自举工具链 / 三后端逐字节一致

📂 开发工具#编程语言#编译器#自举#跨平台#无GC#并发#开发工具📅 2026-10-9

并发编程指南

📅 2026-10-9

xxc 并发编程指南

> 需要 --features concurrency 构建(官方发布的全部二进制均已内置)。

> 解释器与编译产物携带同一套 worker 池运行时,语义一致。

> 相关页:语言指南 ·

> 快速开始 ·

> English: Concurrency Guide。

并发

spawn 启动一个任务,在运行时的 worker 线程上并行执行(worker 数

由 XXC_CONC_WORKERS 指定,默认按 CPU 数推导)。任务极轻(每个是带

独立栈的协程)——可以 spawn 上千个。

ch := chan(4)               // 有缓冲通道(容量 4)
spawn {
    ch <- compute()         // 发送
}
v := <-ch                   // 接收(阻塞直到可用)
  • chan() 创建无缓冲(汇合)通道;chan(n) 创建有缓冲通道。
  • 满时发送阻塞、空时接收阻塞;阻塞的是任务——其他任务继续运行。
  • 无缓冲通道上的值直接递交等接收方。

select

select {
    case x := <-ch1 { print("ch1:", x) }
    case ch2 <- 42   { print("sent") }
    default          { print("nothing ready") }   // 可选:非阻塞
}

select 提交到首个就绪的操作;带 default 则永不阻塞。通道与发送值

在进入时求值一次。

语义

  • main 返回即程序退出(剩余任务丢弃),与 Go 一致;
  • 所有任务阻塞且无挂起 I/O 时,运行时报死锁并带源位置;
  • 任务间共享 class 实例、数组与 channel;struct 值跨任务拷贝。
// 并行扇出
results := chan(4)
for i in range(0, 4) {
    spawn { results <- fib(31) }
}
sum := 0
for i in range(0, 4) { sum = sum + <-results }

4 核以上机器上可实测快于顺序版本(4 任务实测约 2.3 倍)。

异步 I/O

std/fs、net/tcp、net/http 的调用看起来阻塞,**但绝不拖住其他

任务**:工作被卸到 I/O 线程池,任务挂起直到完成。

import fs "std/fs"
import tcp "net/tcp"

content := fs.read_file("data.txt")     // 让位;其他任务继续跑
c := tcp.accept(listener)               // 让位

行原子打印

print 语句的各部分(字符串/整数/浮点)在语句级所有者令牌锁下

追加进行缓冲区,遇换行一次性写出——任何后端上,并发任务都不可能

在行中间撕开输出。该性质由 stress 多重集门在 w=2 与 w=4 下逐字验证:

# 验证方式(仓库内):w=4 的输出行多重集必须与 w=1 完全一致
XXC_CONC_WORKERS=4 ./stress_conc | sort   # == w=1 的排序结果

运行时行为速记

  • main 返回即程序退出(剩余任务丢弃),与 Go 一致;
  • 所有任务都阻塞且无挂起 I/O 时,运行时报告死锁并带源位置;
  • XXC_CONC_WORKERS=N 指定 worker 数(默认按 CPU 数推导);
  • 任务间共享 class 实例、数组与 channel;struct 值跨任务拷贝。