Брифинг:
Существуют процессы. Можно создавать дочерние процессы. В Perl это называется forking.
У процесса есть его идентификационный номер, Process ID или PID.
У родительского и дочерних процессов PID-ы разные, поэтому можно "убивать" процессы по PID-ам функцией kill.
Существуют так же потоки или нити - threads. Нити выполняют разнообразные задачи (параллельно или нет, в зависимости от ваших пожеланий), внутри одного процесса. У каждого потока есть его идентификатор - Thread ID или TID, уникальный в пределах одного процесса.
Исходные данные:
Один родительский процесс;
3 потока, два из которых выполняют схожие операции, третий ждет команды с клавиатуры.
Задача:
Завершить один из двух потоков по выбору, при вводе с клавиатуры номера (просто номера, условного обозначения) потока.
Самое главное сделать это не при помощи "хитрого изъеба" (например в глобальном массиве держать булевы значения, отвечающие за продолжения выполнения бесконечных циклов, содержащихся в потоках, и задание соответствующего значения в fasle когда нужно завершить конкретный поток), а сделать это "красиво" имеющимися в распоряжении языка средствами (ведь вопрос я задаю именно из-за недостатка глубоких, специфических знаний оного).
Предупреждения:
Маны читать не предлагать - читал, не помогло;
Гугл пользовать тоже не стоит предлагать - там только про убийство процессов.
Кому нужно вот код:
#!/usr/bin/perl
use threads;
$| = 1;
# Процедура третьего потока, вводим с клавиатуры строку, обрубаем
# Проверяем: e - выход, 1 / 2 - <вы должны придумать, что тут делать =)>
sub prin {
use Switch; # Для старого доброго свитч-кейс
while (<>) {
chomp;
switch ($_) {
case "e" { last; }
case "1" { <Здесь мог бы быть ваш код> }
case "2" { <Здесь мог бы быть ваш код> }
}
last;
}
close Switch;
}
# Процедур первых двух потоков
sub wow {
my $param = shift @_;
while (1) {
print "$param \n";
sleep 1;
}
}
# Запускаем потоки обозначая, что не нужно дожидаться их завершения в случае
# завершения основного потока
threads->create (\&wow, "Привет.")->detach();
threads->create (\&wow, "Пока.")->detach();
# А завершения этого потока дожидаемся
threads->new (\&prin)->join();
#
print "Основной поток завершен.\n";
Примечание:
PS:
В процедуре prin case "e" { last; }, заменить на case "e" { return; } и убрать last; после блока switch.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.