Рейтинг - 3.6 (5)

В этом уроке мы продолжим изучать потоки. Урок посвящен запуску нескольких потоков и описаны правила переходов между ними.

Итак запускать поток мы научились. Давайте научимся запускать несколько потоков одновременно! В CLEO такой возможности нет ( есть аналоги, но сейчас не о этом ), поэтому я вас учу сначала редактировать именно "main.scm". Но ближе к делу. Все потоки запускаются, как уже было сказано с помощью команды create_thread. Теперь в работающем потоке пишем несколько таких команд:

// ...
create_thread @POTOK
create_thread @POTOK_1
create_thread @POTOK_2
end_thread 

:POTOK
thread 'POTOK'
wait 0 
jump @POTOK_5

:POTOK_5
wait 0
end_thread

:POTOK_1
thread 'POTOK_1'
wait 0 
jump @POTOK_1_4

:POTOK_1_4
wait 0
end_thread

:POTOK_2
thread 'POTOK_2'
wait 0 
jump @POTOK_2_3

:POTOK_2_3
wait 0
end_thread 

Вот мы выполнили нашу задачу - запустили подряд три потока. Они будут выполнятся одновременно! Смысл в том, что мы "нанимаем" три наших знакомых шарика и они вкалывают на нас. Графически это можно описать так:

С рисунка видно, что работают 3 шарика. При этом потоки могут быть в разных местах, то есть если в начале мы напишем так:

create_thread @POTOK
create_thread @POTOK_3
create_thread @POTOK_2

то, работать они будут так же. Разницы нету.

Вот вам картинка:

Так что запомним: Шарик знает только себя, выполняет только свою работу. Остальные шарики ему по барабану, как и на их работу. Я бы сказал, что он имеет свою сферу влияния, которая действует только на том потоке, на котором его вызвали. Технически этот шарик к другим потокам обращаться не должен.

Но есть одна особенность в этом случае: если метка для прыжка находится в другом потоке, но от неё идёт комманда прыжка обратно в первый, то ошибки не будет! Вот картинка, что бы вы поняли о чём я:

Дело в том, что Sanny Builder автоматичеки распределяет сферы влияния, а в месте с ними и метки, которые ей принадлежат. Таким образом, метка "POTOK_1_4" автоматически отнесётся к потоку "POTOK", даже, если она находится в середине потока "POTOK_1".

Вот скрин:

Хоть и шарики могут вызываться подряд, но между вызовами есть крохотная задержка. А это значит, что если мы поменяем вызовы местами, то выйдет следующее:

Так что нужно быть внимательным при запуске потоков.

Думаю, Вы заметили, что в последних картинках, в потоке "POTOK_1" в место "end_thread" стоит "jump @POTOK_1". Это значит, что данный поток будет повторяться. Причём бесконечно! Но о бесконечности мы поговорим в следующих уроках.

В общем, если запускать потоки, которые будут работать одновременно, советую не делать "create_thread" с разных потоков, что бы избежать все возможных ошибок и глюков.


Теги: SCM, thread, потоки

BalashovM   (06.12.15 16:37)
Я так понял, что при "прыжке на метку в другой поток" необходимо, чтобы прыжки заканчивались на метке в исходном потоке? То есть, прыгнуть в другой поток нельзя, а из своего потока в чужой и обратно - можно?

0
wmysterio   (06.12.15 16:47)
Здесь суть в метках и том, в каком потоке они находятся. Если в одном потоке идёт прыжок на любую метку, то та метка автоматически будет числится как метка этого потока и как-бы резервирует её для своих нужд. Следовательно, другому потоку уже нельзя будет прыгать на зарезервированную метку. Скриптово, конечно, можно сделать прыжок, но последствия будут не предсказуемы.

BalashovM   (06.12.15 16:52)
То есть, если метка находится в пределах одного потока, между операторами thread и end_thread, то это вовсе не значит, что она ему принадлежит?

wmysterio   (06.12.15 16:58)
Верно! Находится она может где-угодно. Важно, что-бы она приводила к end_thread'у того потока, откуда был вызван прыжок. Обычно, такой путаницы не возникает при разработке скриптов.

BalashovM   (27.12.15 13:51)
Между прочим, в первом уроке с Опкодами НЕ БЫЛО СКАЗАНО, что потоки СОЗДАЮТСЯ командой create_thread, только ЗАПУСКАЮТСЯ (НАЧИНАЮТСЯ С) командой thread.

0
wmysterio   (28.12.15 06:15)
Ну в текущем случаи запускаются и создаются как синонимы. В оригинале команда называется "START_NEW_SCRIPT", так что правило будет сказать "запускаются". Команда "thread" просто даёт имя потоку. В то время, когда писался урок, этого ещё не знали, так как не было известно описание оригинальных названий опкодов
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Что Вы думаете о "Проекте 'Неизвестный': Чёрный список"?
Всего ответов: 1
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
Рекомендую
Реклама