как использовать многопоточность в скрипе 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 ответа:
Во-первых, скрипучая ВМ предлагает только зеленые потоки, то есть ВМ работает в одном процессе, и потоки моделируются внутри этого единого процесса.
Чтобы использовать потоки (просто называемые процессами в скрипе), вы обычно посылаете сообщение
#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.