thread

std.sync.thread

rec Thread

pub rec Thread;

已派生线程的句柄

tid:内核线程 ID stack:已分配栈区域基址的指针 done:完成标志(0=运行中,1=已完成)

fun spawn_with

pub fun spawn_with(f: fun(*u8), arg: *u8, t: *Thread);

派生一个执行 f 的新线程,并向其传递一个不透明的上下文指针

分配一个 2MB 的栈,然后调用处理 clone 和蹦床(trampoline)设置的 OS thread_spawn 原语。子线程调用 f(arg),设置完成标志,并在退出时唤醒等待者。arg 无需解析即直接传递给入口点,因此调用者可以直接向线程传递其每个线程的状态(例如接受的连接),而不必通过全局槽进行路由。

该句柄由调用者拥有并就地初始化:子线程通过 ?t.done 写入完成标志,因此该记录在线程的生命周期内必须保持在稳定的地址(按值返回会向子线程传递一个死栈帧的地址,参见 issue #195)。arg 同样必须比线程活得更久。

f:入口函数;接收 arg 作为其唯一参数 arg:传递给 f 的不透明指针,或 nil t:调用者拥有的句柄,由该调用初始化;失败时 t.tid < 0

fun spawn

pub fun spawn(f: fun(), t: *Thread);

派生一个执行给定零参数函数的新线程

对于不需要上下文的入口点,这是优于 spawn_with 的便利函数:入口点运行时带有它可以忽略的 nil 参数。

f:要在新线程中执行的函数 t:调用者拥有的句柄,由该调用初始化;失败时 t.tid < 0

fun join

pub fun join(t: *Thread);

等待线程完成

使用 OS 等待原语在 done 标志上阻塞。线程的栈在线程退出前由蹦床释放。

t:指向线程句柄的指针

fun is_done

pub fun is_done(t: *Thread) bool;

检查线程是否已执行完成

t:指向线程句柄的指针 ret:如果线程已完成则为 true