Racket 球拍等级与线的相互作用
这个问题不是关于我遇到的某个特定问题,而是我发现很难解决的问题。问题的背景是racket类和线程。考虑下面的<代码>演员%类,其中包含一个参与者线程,一个在线程的邮箱中排队消息的方法,以及一个接收返回值的方法(它不做任何有用的事情,只打印它)。p> 作为旁注,如果想要创建一个参与者,他们必须首先创建一个子类,该子类实现参与者理解的某些消息(作为方法)。它们具有发送消息的机制(例如,Racket 球拍等级与线的相互作用,racket,Racket,这个问题不是关于我遇到的某个特定问题,而是我发现很难解决的问题。问题的背景是racket类和线程。考虑下面的演员%类,其中包含一个参与者线程,一个在线程的邮箱中排队消息的方法,以及一个接收返回值的方法(它不做任何有用的事情,只打印它)。p> 作为旁注,如果想要创建一个参与者,他们必须首先创建一个子类,该子类实现参与者理解的某些消息(作为方法)。它们具有发送消息的机制(例如,(actor发送actor'hello'world)用于向actoractor发送消息,该actoractor调用带有参数的
(actor发送actor'hello'world)
用于向actoractor
发送消息,该actoractor
调用带有参数的方法hello
)
所有参与者都在自己的线程中运行,定义如下。简而言之:它从线程的收件箱中获取一条消息,获取源(一个参与者)、方法(一个符号)和一些值(一个列表),然后自己调用actor%
的实例化子类上的相应方法
(define (create-actor-thread self)
(thread
(lambda ()
(let actor-loop ()
;#####----- Receive message -----#####
(define message (thread-receive))
(define source (message-source message))
(define method (message-method message))
(define values (message-values message))
(define return-value (dynamic-send self method values))
(send source receive-value return-value)
(actor-loop)))))
我知道被调用消息的主体是在新线程的上下文中处理的,但是从并发性的角度来看,这对参与者来说是如何工作的呢?同时,当actor线程执行繁重的工作时,actor可以在线程的邮箱中对消息进行排队。我无法理解的是(或者可以找到合理的解释)actor对象似乎生活在两个上下文中:原始上下文和actor线程的上下文。两者都可以访问同一对象。是否存在一种错误的并发感,或者是否有某种魔力使这一切都很好地工作
我无法理解的是(或者可以找到合理的解释)actor对象似乎生活在两个上下文中:原始上下文和actor线程的上下文
actor对象本身只是堆上的一些数据。原始线程和您在actor对象的初始化中创建的线程都在访问所有线程共享的同一堆上的同一对象的引用
在actor线程中执行方法调用时,实际上是从类方法表中获取对方法实现的引用并运行它。调用确实发生在不同的线程上下文中,但方法实现本身也通过堆共享
一句话:这不是魔术,它只是线程之间共享内存的使用。我假设所有对字段的访问都是线程安全的,这样我就不用太担心了?
(define (create-actor-thread self)
(thread
(lambda ()
(let actor-loop ()
;#####----- Receive message -----#####
(define message (thread-receive))
(define source (message-source message))
(define method (message-method message))
(define values (message-values message))
(define return-value (dynamic-send self method values))
(send source receive-value return-value)
(actor-loop)))))