Несколько потоков или процесс с потоками - PullRequest
4 голосов
/ 29 марта 2010

Мне нужно смоделировать игру, в которой у каждого игрока есть очереди, и ему нужно «обратить внимание» на происходящее.

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

У меня вопрос: должен ли я работать с каждым игроком как с "веткой" и с нитями на вилке, или просто создать несколько нитей для игрока и как-то их связать?

Впервые я работал с параллелизмом, семафорами и потоками, поэтому я не уверен насчет хороших практик и стиля программирования.

Ответы [ 2 ]

3 голосов
/ 29 марта 2010

Вы наткнулись на грань огромной религиозной войны, вращаясь вокруг вопроса

Должны ли программы, управляемые событиями, быть написаны с использованием нескольких потоков или одного цикла обработки событий ?

Лагерь потоков полагает, что отдельные сущности, такие как «игроки», легче программировать, когда они пишутся как реальные потоки, возможно, просто отказываясь от процессора, когда они больше не нужны. Информация о состоянии проигрывателя может храниться в локальных переменных и даже в счетчике программы. Но с потоками вам, возможно, придется беспокоиться об атомарности, взаимоблокировке и других радостях параллельного программирования.

Лагерь, управляемый событиями, считает, что гораздо проще получить правильное целое приложение, когда каждый объект способен реагировать на каждое событие, и этот объект получает полный контроль над процессором в течение времени, необходимого для обработки события. (который должен быть конечным, и обычно лучше быть коротким). Нет проблем с параллелизмом, потому что каждый обработчик событий выполняется атомарно, но есть затраты на программирование: когда обработчик события завершается, все его процедуры завершаются, и поэтому информация о его состоянии должна храниться в полях объекта, размещенного на куча.

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

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

Поскольку вы спрашивали о потоках, я настоятельно рекомендую библиотеки потоков и каналов в C-интерфейсах и реализациях Дэйва Хэнсона . Программное обеспечение бесплатное, и книгу стоит купить - оно включает в себя множество других модулей, которые будут невероятно полезны всем, кто пишет домашние задания на языке C.

Должен ли я работать с каждым игроком как с "веткой" и как с нитями на вилке, или просто создавать какие-то нити для игрока и как-то их ассоциировать?

Если бы вас не попросили использовать fork, я бы избегал этого - механизмы взаимодействия между процессами Unix не очень приятны для использования. Если вы можете получить библиотеку Hanson, я бы сказал, создайте поток для каждого игрока и попросите игроков общаться друг с другом (и с игровым сервером, который также должен быть потоком), используя каналы Hanson .

1 голос
/ 29 марта 2010

В пошаговой ситуации (игре) вам на самом деле не нужны нити, волокна / сопрограммы подойдут (лучше).

«Внимание» не требует потока, просто доступ к состоянию (-changes), когда вы готовы действовать снова.

...