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

标签 multithreading common-lisp concurrentmodification

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

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

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

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

最佳答案

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

如果确实有理由要使用不可变的结构,请使用带有只读defstruct的defconstant(defstruct number (value :read-only t))(defconstant +five+ (make-number 5))

关于multithreading - 对内置通用Lisp对象的多线程(并行)访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55365542/

相关文章:

parameters - 无法传递从命令行参数解析的函数参数

java - 可以获取、放置和删除 HashMap 中的元素而无需迭代导致 ConcurrentModificationException?

format - 如何在 Lisp 中将 0 添加到整数列表中

java - ConcurrentModificationException - HashMap

java - 集合 - Iterator.remove() 与 Collection.remove()

c# - 如何停止ThreadPool中的线程?

multithreading - 超线程 CPU + 调度程序上的硬件线程(逻辑内核)

java.util.concurrent.locks.Condition awaitUninterruptibly()

c++ - 所有用例的双重检查锁是否都已损坏?

lisp - 什么版本的 LISP 有 putprop?