как использовать многопоточность в скрипе 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.
2 2

2 ответа:

Во-первых, скрипучая ВМ предлагает только зеленые потоки, то есть ВМ работает в одном процессе, и потоки моделируются внутри этого единого процесса.

Чтобы использовать потоки (просто называемые процессами в скрипе), вы обычно посылаете сообщение #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 и, возможно, прочитать оригинальные Smalltalk книги Адель Голдберг (доступные в вашем любимом интернет-магазине книг).

И вы, конечно, должны быть осторожны во взаимодействии между вашими потоками и UI.

Возможно, Вам не нужны потоки, вы также можете использовать stepping в Morphic.