在https://stackoverflow.com/posts/comments/97440894?noredirect=1的另一篇文章中提到了对Lisp对象进行多线程访问的主题,但这是一个附带问题,我希望得到进一步的澄清。
通常,Lisp函数(以及特殊形式,宏等)似乎自然地分为对象的访问器和修饰符。共享对象的修饰符在多线程应用程序中显然存在问题,因为同时进行的更新可能会相互干扰(需要保护性锁,原子操作等)。
但是潜在的访问者干扰问题似乎不太清楚。当然,任何访问器都可以编写为包含潜在的修改代码,但是我想认为基本的Lisp访问器操作(如CLHS中指定的并针对各种平台实现)不包含在内。但是,我怀疑出于效率原因可能会有很少的例外-如果在没有保护的情况下以其他方式在多线程代码中使用这些例外,应该很好地意识到这些例外。 (我所谈论的异常类型是{em> not 操作,例如maphash
,可以同时用作访问器和修饰符。)
如果有实施经验的人可以指出至少一个内置的仅访问操作(例如在SBCL或其他来源中),这可能会带来麻烦的修改,这将很有帮助。我知道很难获得保证,但是启发式指导也很有用。
答案 0 :(得分:0)
任何执行该操作的代码都会成为支持多线程的实现中的错误。 SBCL使用著名的*world-lock*
保护不是线程安全的函数。
如果确实有理由要不可变的结构,请将defconstant
与只读defstruct一起使用。
(defstruct number (value :read-only t))
(defconstant +five+ (make-number 5))