Карочи, есть два основных типа "многопоточки":
— Лёгкие треды (они же "зелёные"), это типа корутин. Хотя у разных ЯП бывают разные реализации, где-то кажется можно даже нарваться на "многопроцессорные" извращения, но не в луа. Их прекол в том, что это фактически другая организация кода. Как будто много-много наставленных goto (плюс свапы стеков и окружения). Их можно наплодить сто тыщ мильярдов, и они очень быстро свапаются, отлично заходит под асинхронный код, и его можно писать так как будто он нормальный и синхронный, правда если что-то заблокирует исполнение — оно будет заблокировано, и всё будет стоять: goto же, почти ничего больше. Луёвые корутины — именно такие.
— Нормальные треды. Это когда язык требует у ОС, мол: "выдай мне тред, и загони в него вот это вот", например виртуальную машину скриптового языка вместе со скриптом. И операционная система уже им занимается: выделяет процессорное время на разных ядрах, помогает размечать память под каждый отдельный поток и так далее. Это полностью отдельный процесс, но если родительский грохнут, то детей через некоторое время вытрет ОС. Их не стоит плодить сто тыщ мильярдов, потому что свапы между потоками ОС проворачивает довольно медленно, плюс они начинают конкурировать за процессорное время и мешают друг другу, как правило, таких потоков (если они сильно нагружены) приложение создаёт не больше N - 1, где N — количество физических ядер цпу. Общение же между такими потоками обычно через пайпы ОС (пересылка строчек), сокеты (пересылка строчек) или шаред-мемори (общие участки памяти, как правило для хранения общих строчек, но иногда там хранят и структуры, вот извращенцы).