Zer0Galaxy 2 187 Опубликовано: 5 января, 2015 Многопоточность в 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() - прекращает выполнение всех параллельных потоков, за исключением основного. Вызывать эту функцию полезно перед завершением программы. В противном случае действующие потоки продолжат свою работу даже после выхода из программы. 8 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
DUIIIES 284 Опубликовано: 5 января, 2015 Ух ты, отличная библиотека, а главное удобная-то какая в работе! Спасибо, Зеро) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 6 января, 2015 Спасибо, Дима, огромное, библиотека супер! Слов нет, одни слюни. Ты просто маг Луа! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 6 января, 2015 Ох май, обязательно буду пользоваться. Нужно наконец вернуться к моей строительной черепашке, там я как раз остановился на распараллеливании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 6 января, 2015 Пользуйтесь осторожно. Библиотека еще не обкатана. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
1Ridav 1 049 Опубликовано: 6 января, 2015 Как обстоят дела с критическими точками и состоянием гонки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 6 января, 2015 Как обстоят дела с критическими точками и состоянием гонки?Э! А это что такое? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
1Ridav 1 049 Опубликовано: 6 января, 2015 Э! А это что такое? https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%B3%D0%BE%D0%BD%D0%BA%D0%B8 https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%B5%D0%BA%D1%86%D0%B8%D1%8F Так же желательно ознакомиться с этими материалами https://ru.wikipedia.org/wiki/%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0 https://ru.wikipedia.org/wiki/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81 https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%BC%D0%B0%D1%84%D0%BE%D1%80_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29 https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0_ABA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 6 января, 2015 Как обстоят дела с критическими точками и состоянием гонки? А эти проблемы актуальны для сопрограмм Lua? Проблема может возникнуть при неправильном проектировании программы (например доступа к файлу), но это уже проблема программиста а не библиотеки. Или я ошибаюсь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 6 января, 2015 А эти проблемы актуальны для сопрограмм Lua?Проблема может возникнуть при неправильном проектировании программы (например доступа к файлу), но это уже проблема программиста а не библиотеки. Или я ошибаюсь? Конечно. Ошибаешься. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 6 января, 2015 Конечно. Ошибаешься. Аргументацию в студию! Пожалуйста. Хочу разобраться с этим вопросом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 6 января, 2015 Аргументацию в студию! Пожалуйста. Хочу разобраться с этим вопросом. если пишешь либу для других программистов,нужно писать нормально,а ты пишешь под себя.(Помнишь либу socket).Zer0Galaxy правильно делает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 6 января, 2015 если пишешь либу для других программистов,нужно писать нормально,а ты пишешь под себя.(Помнишь либу socket).Zer0Galaxy правильно делает. А. Я не об этом. Я о том, можно ли говорить о проблеме состояния гонки и критических точек применимо к сопрограммам (coroutine) Lua. Исключая те случаи, когда косяк возник по вине программиста. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
JaggerDer 90 Опубликовано: 6 января, 2015 (изменено) Хочу знать, что делает вот это: 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 если эти полученные значения в данный момент не используются? Или тут какое то хитромудреное присваивание? Просто я никак не могу понять, что эта строка делает... Изменено 6 января, 2015 пользователем JaggerDer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 6 января, 2015 Хочу знать, что делает вот это: os.pullEventRaw=SingleThread или os.pullEventRaw=MultiThread. Получается то, что мы присваиваем "не понимаю чему, но судя по названию пулу" pullEventRaw указатель на функцию SingleThread или MultiThread? Почему и зачем это нужно? os.pullEventRaw это стандартная процедура, через которую приложение Lua получает события. Обычно текст этой процедуры соответствует тексту процедуры SingleThread. Но в многопоточном режиме приложение должно не только получать события, но и передавать их в дочерние процессы. Этим занимается процедура MultiThread, поэтому pullEventRaw перенаправляем на нее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 6 января, 2015 (изменено) А так же зачем нужно делать вот это: 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) Изменено 6 января, 2015 пользователем Zer0Galaxy 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах