2013-04-11 2 views
3

Я взглянул на книгу Lua и узнал, что многопоточность в Lua является совместной. То, что я не мог найти, - это некоторая информация о приоритетах потоков. Я думаю, что потоки с одинаковым приоритетом выполняются до завершения, так как многопоточность является совместной или выполняется выход. Что относительно потока, который имеет более высокий приоритет, чем другой?Приоритеты нитей в Lua

Возможно ли прервать одно с более низким приоритетом или он будет работать дальше, когда поток с более низким приоритетом будет работать до завершения?

ответ

6

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

Разница между упреждающей и совместной многозадачностью заключается в том, что в упреждающей многозадачности «потоки» не обязательно разрешены для запуска до завершения, но могут быть вытеснены другими потоками. Это выполняется планировщиком, который выполняется через равные промежутки времени, переключая один поток на другой. В этом случае приоритеты приходят. Если поток с более высоким приоритетом хочет запустить, он может вытеснить уже запущенный поток с более низким приоритетом, и планировщик будет выбирать этот поток (в зависимости от стратегии планирования), в следующий раз, когда запускается планировщик.

В совместной многозадачности не обязательно должен быть планировщик (хотя по практическим соображениям обычно это хорошая идея иметь его). Однако существуют совместные процессы. Со-процесс похож на поток, за исключением того, что он не может быть выгружен. Он может либо работать до завершения, либо перейти к другому совместному процессу и разрешить его запуск.

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

Редактировать

Чтобы уточнить, есть небольшая разница между не-вытесняющей многозадачностью и кооперативной многозадачностью. Непрерывная многозадачность немного шире, поскольку она позволяет как статичное планирование, так и совместную многозадачность.

Статическое планирование означает, что планировщик может планировать периодические задачи, которые затем могут выполняться при выполнении задачи, возможно, с более высоким приоритетом.

Совместная многозадачность также является разновидностью неперехваченной многозадачности. Однако здесь задачи планируются только самими задачами, а управление явно передается из задачи в другую, но какая задача, на которую она уступает, может основываться на приоритете.

+0

Ну ладно, чтобы говорить, что все потоки имеют образно одинаковый приоритет. В более ранних версиях Smalltalk также есть многопользовательская неподдерживаемая многозадачность, но более высокий приоритетный поток может прерывать более низкий, в отличие от потоков одного и того же приоритета, которые не могут прерывать друг друга. – OlliP

+0

Нет нитей, поскольку вы знаете их от pthreads, потому что нет планировщика, а это значит, что также нет понятия приоритетов. Задачи кооперативны, что означает, что они уступают друг другу. – jbr

+0

Спасибо за комментарий в разделе «Редактировать». Очень жаль, что нить в Lua не является превентивной.В любом случае, Lua не будет моим любимым языком сценариев. У нас были такие проблемы, чтобы сделать GUI отзывчивым тогда с Smalltalk. Подумайте, я попробую Lua Lanes. Несчастливо, это кажется слишком тяжелым для небольших вещей, которые нужно запускать параллельно. – OlliP

3

В потоках Lua не может работать в паралеле (то есть на нескольких ядрах) в одном состоянии Lua. Нет параллелизма, поскольку это совместная многозадачность. Только когда один поток приостанавливает выполнение (дает), может возобновиться другой поток. Ни в коем случае два потока Lua не выполняются одновременно в одном состоянии Lua.

Что вы говорите, это преемственность - планировщик прерывает один поток, чтобы другой выполнял.