多线程(并行)访问内置通用Lisp对象

时间:2019-03-26 20:13:06

标签: multithreading common-lisp concurrentmodification

https://stackoverflow.com/posts/comments/97440894?noredirect=1的另一篇文章中提到了对Lisp对象进行多线程访问的主题,但这是一个附带问题,我希望得到进一步的澄清。

通常,Lisp函数(以及特殊形式,宏等)似乎自然地分为对象的访问器和修饰符。共享对象的修饰符在多线程应用程序中显然存在问题,因为同时进行的更新可能会相互干扰(需要保护性锁,原子操作等)。

但是潜在的访问者干扰问题似乎不太清楚。当然,任何访问器都可以编写为包含潜在的修改代码,但是我想认为基本的Lisp访问器操作(如CLHS中指定的并针对各种平台实现)不包含在内。但是,我怀疑出于效率原因可能会有很少的例外-如果在没有保护的情况下以其他方式在多线程代码中使用这些例外,应该很好地意识到这些例外。 (我所谈论的异常类型是{em> not 操作,例如maphash,可以同时用作访问器和修饰符。)

如果有实施经验的人可以指出至少一个内置的仅访问操作(例如在SBCL或其他来源中),这可能会带来麻烦的修改,这将很有帮助。我知道很难获得保证,但是启发式指导也很有用。

1 个答案:

答案 0 :(得分:0)

任何执行该操作的代码都会成为支持多线程的实现中的错误。 SBCL使用著名的*world-lock*保护不是线程安全的函数。

如果确实有理由要不可变的结构,请将defconstant与只读defstruct一起使用。 (defstruct number (value :read-only t))

(defconstant +five+ (make-number 5))