如何在 squeak smalltalk 中使用多线程?

how to use Multi threading in squeak smalltalk?

我想知道如何在 squeak smalltlak 中使用线程

b1 := Ball new.
b2 := Ball new.

这 2 个下一个对象应该 运行 在不同的线程中一起(多线程)。 我该怎么做?

"Thread 1"
    b1  start:210 at:210.    "start is the name of the method"

"Thread 2"        
    b2  start:310 at:210.

首先,Squeak VM 仅提供绿色线程,即 VM 在单个进程中运行,线程在该单个进程内模拟

要使用线程(在 Squeak 中简称为 processes),通常将消息 #fork#forkAt: 发送到块:

[ b1 start: 210 at: 210 ] fork.
[ b1 start: 210 at: 210 ] forkAt: Processor userBackgroundPriority.

这就是它的全部内容,除非您需要进程间通信的工具。然后你可以对临界区使用 Mutex(一次只能有一个进程在这个区段中)或 Semaphore 来控制对共享资源的访问:

"before critical section"
self mutex critical: [ "critical section" ].
"after critical section"

"access shared resource"
self semaphore wait.
"do stuff..."
"release shared resource"
self semaphore signal.

方法#semaphore#mutex 只是变量的访问器。这些变量应该 not 延迟初始化,但是 before 多个进程可以调用这些方法。这通常意味着您将在 #initialize 方法中初始化它们:

initialize
  semaphore := Semaphore new.
  mutex := Mutex new.

原因是你不能保证一个进程不会在#ifNil:块中被挂起。这可能会导致两个进程使用两个不同的互斥量/信号量。

如果您需要更多信息,您应该看看 Deep into Pharo 这本书,也许还可以阅读 Adele Goldberg 的 Smalltalk 原著(可在您最喜欢的在线书店购买)。

您当然应该注意 threads and the UI.

之间的互动

你可能不需要线程,你也可以在 Morphic 中使用步进。