Перейти к содержимому


Фотография

Многопоточность в ComputerCraft

многопоточность

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 15

#1 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 186
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

5                                 

Отправлено 06 Январь 2015 - 00:07

Многопоточность в CraftOS легко реализуется при помощи стандартной библиотеки parallel. Способ этот отличается простотой и может быть использован даже начинающими программистами. Чего уж проще? Оформи каждый поток в виде отдельной функции и вызови waitForAll или waitForAny.

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

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

Во-вторых, функции, содержащие параллельные потоки, обречены вызываться без параметров.

В-третьих, после запуска такая параллельность не контролируема. Отсутствует возможность принудительно прервать какой либо из потоков или добавить к уже существующим еще один.

 

Несколько иную многопоточность можно реализовать при помощи библиотеки thread, доступной по адресу http://pastebin.com/32S4HssH

Библиотека содержит три функции:

thread.create(f , ...) - создает поток, который сразу же начинает выполняться параллельно основному потоку. При желании можно создать серию потоков, вызвав функцию create несколько раз подряд. В качестве параметра f необходимо указать функцию, содержащую тело потока. После f  можно указать параметры, передаваемые ей.

Функция create возвращает вновь созданный поток как объект типа нить ("thread"). Значение это может понадобиться если вы захотите прервать принудительно созданный поток.

thread.kill(co) - прерывает выполнение параллельного потока. co - завершаемый поток, значение, полученное при вызове функции create.

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



#2 Оффлайн   DUIIIES

DUIIIES
  • Пользователи
  • Сообщений: 280
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородКоролёв

Отправлено 06 Январь 2015 - 01:39

Ух ты, отличная библиотека, а главное удобная-то какая в работе! Спасибо, Зеро)

#3 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 452
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 06 Январь 2015 - 04:39

Спасибо, Дима, огромное, библиотека супер! Слов нет, одни слюни. Ты просто маг Луа! :D :smile9:



#4 Оффлайн   Krutoy

Krutoy
  • Пользователи
  • Сообщений: 494
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                 

Отправлено 06 Январь 2015 - 07:26

Ох май, обязательно буду пользоваться. Нужно наконец вернуться к моей строительной черепашке, там я как раз остановился на распараллеливании.



#5 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 186
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

5                                 

Отправлено 06 Январь 2015 - 09:08

Пользуйтесь осторожно. Библиотека еще не обкатана.

#6 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Администраторы
  • Сообщений: 260
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

         2         

Отправлено 06 Январь 2015 - 11:18

Как обстоят дела с критическими точками и состоянием гонки?



#7 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 186
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

5                                 

Отправлено 06 Январь 2015 - 11:28

Как обстоят дела с критическими точками и состоянием гонки?

Э! А это что такое?

#8 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Администраторы
  • Сообщений: 260
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

         2         

Отправлено 06 Январь 2015 - 11:37



#9 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 615
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                                      

Отправлено 06 Январь 2015 - 12:32

Как обстоят дела с критическими точками и состоянием гонки?

А эти проблемы актуальны для сопрограмм Lua?

Проблема может возникнуть при неправильном проектировании программы (например доступа к файлу), но это уже проблема программиста а не библиотеки. Или я ошибаюсь?



#10 Оффлайн   NEO

NEO
  • Java
  • Сообщений: 1 646
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородСолнце

Награды

   2                        

Отправлено 06 Январь 2015 - 14:49

А эти проблемы актуальны для сопрограмм Lua?
Проблема может возникнуть при неправильном проектировании программы (например доступа к файлу), но это уже проблема программиста а не библиотеки. Или я ошибаюсь?


Конечно. Ошибаешься.

#11 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 615
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                                      

Отправлено 06 Январь 2015 - 15:07

Конечно. Ошибаешься.

Аргументацию в студию! Пожалуйста.

Хочу разобраться с этим вопросом.



#12 Оффлайн   NEO

NEO
  • Java
  • Сообщений: 1 646
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородСолнце

Награды

   2                        

Отправлено 06 Январь 2015 - 15:41

Аргументацию в студию! Пожалуйста.

Хочу разобраться с этим вопросом.

если пишешь либу для других программистов,нужно писать нормально,а ты пишешь под себя.(Помнишь либу socket).Zer0Galaxy правильно делает.



#13 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 615
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                                      

Отправлено 06 Январь 2015 - 16:39

если пишешь либу для других программистов,нужно писать нормально,а ты пишешь под себя.(Помнишь либу socket).Zer0Galaxy правильно делает.

А. Я не об этом. Я о том, можно ли говорить о проблеме состояния гонки и критических точек применимо к сопрограммам (coroutine) Lua. Исключая те случаи, когда косяк возник по вине программиста.


  • Zucker это нравится

#14 Оффлайн   JaggerDer

JaggerDer
  • Пользователи
  • Сообщений: 38
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

        

Отправлено 06 Январь 2015 - 19:39

Хочу знать, что делает вот это: os.pullEventRaw=SingleThread или os.pullEventRaw=MultiThread. Получается то, что мы присваиваем "не понимаю чему, но судя по названию пулу" pullEventRaw указатель на функцию SingleThread или MultiThread? Почему и зачем это нужно?

А так же зачем нужно делать вот это:

if coroutine.status( co ) == "dead" then
 filter[co],co=nil,next(filter,co)
else

То есть, если подпрограмма остановлена, то получаем список её аргументов из filters. Затем удаляем указатель на подпрограмму, чтобы её потом скушал сборщик мусора. Затем получаем следующие аргументы для последующей подпрограммы. Зачем нужно получать аргументы подпрограммы co если эти полученные значения в данный момент не используются? Или тут какое то хитромудреное присваивание? Просто я никак не могу понять, что эта строка делает...


Сообщение отредактировал JaggerDer: 06 Январь 2015 - 20:27


#15 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 186
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

5                                 

Отправлено 06 Январь 2015 - 23:17

Хочу знать, что делает вот это: os.pullEventRaw=SingleThread или os.pullEventRaw=MultiThread. Получается то, что мы присваиваем "не понимаю чему, но судя по названию пулу" pullEventRaw указатель на функцию SingleThread или MultiThread? Почему и зачем это нужно?

os.pullEventRaw это стандартная процедура, через которую приложение Lua получает события. Обычно текст этой процедуры соответствует тексту процедуры SingleThread. Но в многопоточном режиме приложение должно не только получать события, но и передавать их в дочерние процессы. Этим занимается процедура MultiThread, поэтому pullEventRaw перенаправляем на нее.



#16 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 186
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

5                                 

Отправлено 06 Январь 2015 - 23:29

А так же зачем нужно делать вот это:

if coroutine.status( co ) == "dead" then
 filter[co],co=nil,next(filter,co)
else

То есть, если подпрограмма остановлена, то получаем список её аргументов из filters. Затем удаляем указатель на подпрограмму, чтобы её потом скушал сборщик мусора. Затем получаем следующие аргументы для последующей подпрограммы. Зачем нужно получать аргументы подпрограммы co если эти полученные значения в данный момент не используются? Или тут какое то хитромудреное присваивание? Просто я никак не могу понять, что эта строка делает...

Если сопрограмма остановлена, то исключаем ее из списка 

 filter[co]=nil

и берем следующую

 co=next(filter,co)

Но если сделать именно так, то получим исключку т.к. filter[co] к этому моменту уже не существует.

Можно было бы сделать через промежуточную переменную:

 co1=next(filter,co)
 filter[co]=nil
 co=co1

но тогда никто бы не поверил, что я умею программировать на Lua. Поэтому я использовал параллельное присваивание (см. http://www.lua.ru/doc/2.4.3.html)


Сообщение отредактировал Zer0Galaxy: 06 Январь 2015 - 23:33

  • NEO, Krutoy, Totoro и еще 1 это нравится





Темы с аналогичным тегами многопоточность

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных