协同程序
协同程序是Felix的基本构建块。你的主线程序实际上是一个协同程序!
// schannels for communication
var inp, out = mk_ioschannel_pair[int]();
// writer fibre
spawn_fthread {
for i in 1..10 do
println$ "Sending " + i.str;
write (out,i);
done
};
// reader fibre
spawn_fthread {
while true do
var x = read inp;
println$ "Read " + x.str;
done
};
在这个简单的例子中 mk_ioschannel_pair 函数用于构造 同步信道 对象,并返回对它的两个引用, inp 这是为了便于阅读而打印的,以及 out 它是用来打字的。
然后我们使用 spawn_fthread 从自变量协程构造纤维。在Felix的协同程序只是一个过程。不,等等!事实上。。程序只是一个协同程序!
一次先发制人 线 控制权可以由许多股编织而成 纤维 . 在Felix,我们制造的纤维叫做 fthreads ,而先发制人被称为 pthreads .
我们的writer协程是一个循环,它在通道中写入10个整数。我们的读取器协程是一个无限循环,它读取整数,直到没有可读取的整数。我们使用调试打印来见证活动。
光纤不能同时或异步运行!光纤化是一种非确定性的交织控制方法,是完全同步的。特别地 schannels 不提供任何缓冲,它们的主要功能是中介控制交织。
假设我们的作者先开始。当它到达write语句时,它被挂起。直到读卡器开始读。然后它也会暂停。
现在,调度程序将读卡器中的整数复制到写入程序,将两者都放在活动纤程的列表中,然后选择要运行的光纤,这是通过解冻或 resuming 暂停。