绝对可行!
Bordeaux Threads 项目为许多实现提供了线程原语;我建议使用它来代替 SBCL 的特定于实现的原语(特别是如果您不在 SBCL 上!)。
bt 提供的线程原语相当基础。 我曾经使用并喜欢过Eager Future2,它在 bt 基础上提供了使用 futures 的并发功能。 您可以创建懒惰计算、急切计算或投机计算的 futures。 投机计算的 futures 是由可以自定义大小的线程池计算的。
我开始了一个小项目,使用 EF2 提供 CL 函数的并行版本,但目前只有大约三个函数,对任何人都没有太多用处。 当然,我欢迎其他程序员对其进行修改并提交拉取请求,并希望将来能在此方面做更多的工作。
还有许多其他的库在 Cliki 上列出,我自己没有尝试过。
至于教程,我不知道有哪些,但所提供的并发功能在其他语言中也可以找到,并且良好的算法和实践通常不是特定于语言的。
如果您有兴趣阅读一本书,我推荐《并发 C 编程语言》。 作者描述了一种基于 C 的新编程语言,具有并发性作为语言特性。 当然,由于 CL 的性质,可能可以在不创建新编译器的情况下实现这些功能。 在我看来,该书呈现了出色的并发概念,并解决了您在编写并发程序时可能会遇到或忽略的许多问题。
SBCL有一些多线程支持。它的级别太低,并且据我所知,不包括任何并行算法。它只有创建执行某个lambda函数的线程的可能性,然后在测试线程是否已完成(加入它)后。我使用这种支持以极快的速度生成我的博客页面(每个页面或一组页面在不同的线程中)。您可以在此处查看代码:
https://github.com/dsevilla/functional-mind-blog/blob/master/blog/process.lisp
例如,为每个页面生成一个线程的代码大致如下:#+sbcl
(defun generate-post-pages ()
(map nil
#'(lambda (post)
(make-thread (lambda () (page-generation-function post))))
*posts*))
join-thread
,并使用互斥锁等。你可以在这里阅读文档: SBCL Threading。但是这些内容都比较底层,你可能会错过Clojure在并发方面的出色功能...如果你正在寻找适用于不同Lisp的多线程原语的单一POSIX-threads风格接口,那么可以考虑使用bordeaux threads库。
如果我要寻找可靠的免费Lisp实现,我会从CCL开始,然后再试试SBCL。我几乎在所有的测试中都使用CCL,并在剩下的部分中使用SBCL和LispWorks。
Sedach的futures库提供了更高级别的接口。此外,在SBCL的contrib目录中还有其他各种用户的贡献。
这是来自一个既没有使用过bordeaux-threads也没有使用过Sedach's futures library的人的建议,他们都开发了自己的版本。我可以把我的实现发给你,但是这两个包也被认为是很好的,并且它们可能是更好的起点。