如何在吱吱声中使用多线程?

时间:2015-06-07 20:03:54

标签: smalltalk squeak

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

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.

2 个答案:

答案 0 :(得分:6)

首先,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只是变量的访问者。这些变量应该懒得初始化,而 多个进程可以调用方法。这通常意味着您将使用#initialize方法初始化它们:

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

原因是您不能保证不会在#ifNil:块中暂停进程。这可能导致两个进程使用两个不同的互斥锁/信号量。

如果您需要更多信息,请查看Deep into Pharo书籍,也可以阅读Adele Goldberg的原创Smalltalk书籍(可在您最喜爱的在线书店购买)。

答案 1 :(得分:0)

当然,您应该注意threads and the UI之间的互动。

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