2015-06-07 46 views
2

我想知道如何與論壇中的吱工作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. 

回答

6

首先,佳樂VM只提供綠色線程,即虛擬機運行在單個進程和線程模擬這一個進程中。

使用線程(簡稱過程在佳樂)你平時發送消息#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書籍。

+0

我得到一個錯誤backgroundPriority可能是什麼原因?他提供: BackgroundProcess或UserBackgroundPriority – 2Big2BeSmall

+0

是的,對不起。這應該是'#userBackgroundPriority'。修復了答案。 –

0

而且你當然要小心你的threads and the UI之間的相互作用。

您可能不需要線程,也可以在Morphic中使用步進。