我想知道如何在squeak smalltlak中使用Threads
b1 := Ball new.
b2 := Ball new.
Run Code Online (Sandbox Code Playgroud)
这2个下一个对象应该在不同的线程中一起运行(多线程).我该怎么做 ?
"Thread 1"
b1 start:210 at:210. "start is the name of the method"
"Thread 2"
b2 start:310 at:210.
Run Code Online (Sandbox Code Playgroud)
首先,Squeak VM仅提供绿色线程,即VM在单个进程中运行,并且在此单个进程内模拟线程.
要使用线程(在Squeak中简称为进程),通常会将消息发送到块#fork或#forkAt:块:
[ b1 start: 210 at: 210 ] fork.
[ b1 start: 210 at: 210 ] forkAt: Processor userBackgroundPriority.
Run Code Online (Sandbox Code Playgroud)
除非您需要用于进程间通信的工具,否则这就是真的.然后,您可以使用Mutexfor关键部分(一次只能有一个进程在此部分中)或者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.
Run Code Online (Sandbox Code Playgroud)
这些方法#semaphore和#mutex只是访问器变量.这些变量不应该懒惰地初始化,而是在多个进程调用方法之前.这通常意味着您将在#initialize方法中初始化它们:
initialize
semaphore := Semaphore new.
mutex := Mutex new.
Run Code Online (Sandbox Code Playgroud)
原因是您不能保证进程不会在#ifNil:块中挂起.这可能导致两个进程使用两个不同的互斥锁/信号量.
如果您需要更多信息,您应该查看Deep into Pharo书籍,也可以阅读Adele Goldberg的原创Smalltalk书籍(可在您最喜爱的在线书店购买).
| 归档时间: |
|
| 查看次数: |
1236 次 |
| 最近记录: |