Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 16

Программная реализация простого бесприоритетного планировщика потоков

01.09.2017, 00:13. Показов 5105. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программная реализация простого бесприоритетного планировщика потоков.

Исходные данные:
- возможные состояния потоков: выполнение, ожидание, блокировка
- отрабатываемые события: создание нового потока, завершение активного потока, завершение кванта времени у активного потока, блокирование потока, разблокирование потока
- основная структура данных: массив дескрипторов потоков с двумя полями - идентификатор потока, состояние потока
- массив реализует простейшую очередь со сдвигом элементов при удалении
- язык реализации - любой по выбору: C/C++, C#, Java, Pascal/Delphi

Я прислал преподу код: с реальным созданием потоков.

Вот что ответил перепод:
"Нет, это совсем не то что требуется. Реальные потоки создавать не надо, достаточно продемонстрировать работу основной структуры - очереди потоков на основе массива. Программа должна отрабатывать с помощью простейшего меню все 5 событий, показывая состояние очереди после отработки каждого события. "

Помогите, я так понимаю, что нужно создать меню с созданием эмулятора таких потоков.
Возможно есть готовое решением. Выручайте.
Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.09.2017, 00:13
Ответы с готовыми решениями:

Программная реализация простого бесприоритетного планировщика потоков
Доброе утро всем! Нужна Ваша помощь в доработке. Была задача: Программная реализация простого бесприоритетного планировщика потоков. ...

Программная реализация очереди
Друзья, подскажите, почему не правильно работает программа, ругается на функцию EmptyQ программу надо запускать в консольном приложении в...

Программная реализация I2C.
Всем привет. Есть необходимость в реализации софтового I2C - Мастер и Слейв режимы. На руках есть две платы STM32F4-Dyscovery и куча...

48
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.09.2017, 21:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от EpicSR Посмотреть сообщение
Ну для этого нужно перейти командой "Закончить Квант" на требуемый поток, и можно завершить командой "Завершить поток", хоть в середине.
Вы не поняли. Активный в данный момент поток А, хочет прибить не активный пока поток Б. Какой командой ему это сделать? Завершить квант времени он не может - у него тогда управление отберут и команду "прибить Б" отдать не получится. В вашем планировщике получается что прибивать чужие потоки нельзя. Тогда как IRL можно.
0
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
01.09.2017, 21:14
Цитата Сообщение от Renji Посмотреть сообщение
Вы не поняли. Активный в данный момент поток А, хочет прибить не активный пока поток Б. Какой командой ему это сделать? Завершить квант времени он не может - у него тогда управление отберут и команду "прибить Б" отдать не получится. В вашем планировщике получается что прибивать чужие потоки нельзя. Тогда как IRL можно.
Про взаимодействие потоков и синхронизации в условиях задания ничего нету, это было бы сложновато мне кажется.
Чую все равно перпод найдет что то что ему не нравиться. Сдам преподу и потому отпишусь потом.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.09.2017, 21:20
Цитата Сообщение от EpicSR Посмотреть сообщение
Про взаимодействие потоков и синхронизации в условиях задания ничего нету, это было бы сложновато мне кажется.
Хм, а как вы себе представляете разблокирование потока без взаимодействия потоков друг с другом? Ну не может же заблокированный поток разблокировать сам себя.
0
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
02.09.2017, 17:16
Цитата Сообщение от Renji Посмотреть сообщение
Хм, а как вы себе представляете разблокирование потока без взаимодействия потоков друг с другом? Ну не может же заблокированный поток разблокировать сам себя.
Можно списать на абстракцию задания. Вообщем уже четвертый день сижу над этим заданием, посмотрим что скажет препод.

Добавлено через 12 минут
В крайнем случае можно сделать что бы прыгало через блокированный на след поток.

Добавлено через 18 часов 57 минут
Комментарии препода
Кликните здесь для просмотра всего текста

Массив увеличить до 20 элементов. Начальное состояние массива пустое (потоков нет). Потоки можно нумеровать по порядку их создания. При завершении кванта, завершении выполнения потока или его блокировании должен меняться статус следующего за ним потока, это имитация запуска потока на выполнение. Непонятен выбор разблокируемого потока. Добавьте больше комментариев. Число глобальных переменных можно уменьшить. Вместе с исправленным текстом пришлите исполняемый файл. Использование турбопаскаля как то прошлым веком отдает. Консоль можно делать на более современных платформах, например на бесплатном Лазарусе, если уж вам паскаль так дорог...

Renji, по моему это то о чем ты говорил? Выделил черным

Добавлено через 14 минут

Добавлено через 25 минут
Хорошо, изначально поток пуста. Когда создаем поток и добавляем этот поток в очередь она автоматический должна брать управление, иначе никак не получается если это не так. Может ли этот поток сама себя завершит, получается нет? Опять запутался уже.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.09.2017, 20:53
Цитата Сообщение от EpicSR Посмотреть сообщение
Renji, по моему это то о чем ты говорил? Выделил черным
Ага. Препод похоже, тоже не понял как предлагается выбирать блокируемый/разблокируемый/прибиваемый поток.
Цитата Сообщение от EpicSR Посмотреть сообщение
Хорошо, изначально поток пуста. Когда создаем поток и добавляем этот поток в очередь она автоматический должна брать управление, иначе никак не получается если это не так. Может ли этот поток сама себя завершит, получается нет? Опять запутался уже.
Полагаю, если завершился последний поток и очередь опустела, считаем что завершается и весь эмулятор.
0
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
02.09.2017, 20:57
Цитата Сообщение от Renji Посмотреть сообщение
Полагаю, если завершился последний поток и очередь опустела, считаем что завершается и весь эмулятор.
А как может завершится последний поток если по комментариям препода что текущее действие относиться только к следующему потоку. Когда останется два потока, первый из них завершить второй и последний поток некому завершит.
Цитата Сообщение от Renji Посмотреть сообщение
Ага. Препод похоже, тоже не понял как предлагается выбирать блокируемый/разблокируемый/прибиваемый поток.
Я опять зашел в тупик.
Сегодня ничего не буду делать, завтра утром постараюсь что то сделать.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.09.2017, 21:29
Цитата Сообщение от EpicSR Посмотреть сообщение
А как может завершится последний поток если по комментариям препода что текущее действие относиться только к следующему потоку.
Я кажется повторюсь, вам как работает многозадачность объясняли?
Когда управление у текущего потока по каким-то причинам отбирают (кончился квант/заблокировали/прибили), это самое управление передается следующему в очереди не заблокированному потоку. И статус этого самого следующего меняется на "активный".
Если вообще все потоки в очереди заблокированы - поздравляем, вы познакомились с дедлоком. Пишем что программист этих потоков - криворукий идиот.

Все это никак не мешает потоку прибить самого себя. Было бы вообще очень странно, если бы поток этого сделать не мог.
0
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
02.09.2017, 23:36
Лучший ответ Сообщение было отмечено Runinterface как решение

Решение

Цитата Сообщение от Renji Посмотреть сообщение
Когда управление у текущего потока по каким-то причинам отбирают (кончился квант/заблокировали/прибили), это самое управление передается следующему в очереди не заблокированному потоку. И статус этого самого следующего меняется на "активный".
Дело в том что я так и написал программу. Вот креплю программу скомпилировав на лазарусе, теперь она запускается под виндовс. Я его переделал(сменил маскимальный размер очереди с 4 до 20) сегодня и последние 2 функции(блокировка и разблокировка) может работать неправильно, просто не успел потестить еще.

Запустите программу, создайте например 4 потока и попробуйте закончить квант(команда 3). Я не знаю что преподу тут не понравилось, может он не пробовал его запустить потому что я наделялся что он его скомпилирует. А отправил я ему только исходный код.
Это не какой ни вирус как подумал тут один из форумчанина, зачем мне это вообще, я здесь за помощью так то.
Проверьте пожалуйста.
Вложения
Тип файла: rar project1.rar (33.4 Кб, 4 просмотров)
0
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
03.09.2017, 10:21
Потестил функции "Блокировка" и "Разблокировка" работают как я задумал, теперь проверьте пожалуйста логическую часть всех 5 функции.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.09.2017, 14:42
Цитата Сообщение от EpicSR Посмотреть сообщение
Запустите программу, создайте например 4 потока и попробуйте закончить квант(команда 3).
Здесь НЕ запускать выложенные на форум exe файлы - дело принципа. Даже если антивирь на них молчит.
0
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
03.09.2017, 14:45
Цитата Сообщение от Renji Посмотреть сообщение
Здесь НЕ запускать выложенные на форум exe файлы - дело принципа. Даже если антивирь на них молчит.
А скомпилировать не получиться? Паскаль.
Кликните здесь для просмотра всего текста

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
Program Potok2;
 
  type                             // Еденица потока
    descriptor = record
       id : integer;               // Идентефикатор
   status : integer;  {0 - runs, 1 - wait,  2 - blok}  //Состояние
    end;
 
const MAX = 20;                    // Максимальное место в очереди
const astat : array [0..2] of string = ('runs', 'wait', 'blok');  //Служебный данные
 
 
var
        que : array [0..MAX-1]of descriptor;
        i, qnext, qindex, qlength : integer;  //Служебные данные для очереди
        Thead:descriptor;                     //Еденица потока
        func : integer;                       //Пользовательский ответ
        id : integer;
                point : integer;                      //Поток в котором управление
                temp : integer;
                ch : integer;
 
    Procedure IqueInit;                            //Служебная процедура для установки
     begin                                             //переменных по дефолту
      qnext := 0; qindex := qnext;
      qlength:=0;
     end;
 
  function queadd(eque : descriptor):boolean; {Добавление в очередь}
  begin
    queadd := true;
    if qnext < MAX then
      begin
       que[qnext] := eque;
       inc(qnext);
      end
    else queadd := false;
  end;
 
  function quedel(eque : integer):boolean;   {Удаление из очереди}
  begin
    if  qnext = 0 then quedel := false
         else    begin
                for i := eque to qlength-2 do
                   que[i] := que[i+1];
                   dec(qnext);
           dec(qlength);
                   quedel := true;
             end;
  end;
 
begin
    IqueInit;       // Установка по дефолту служебных переменных
    point := 0;     // Указатель показывающий какой поток в данный момент взял управление на себя
        ch := 0;        // Служебная переменная для нумерования(id) потока
 
 
    repeat
    for i := 0 to qlength-1 do         //Вывод состояния очереди
        begin
        write('PoTok [', que[i].id, ']   CTaTyC[', astat[que[i].status],']');
        if point = i then write(' <---- '); writeln;
        end;
 
      writeln('Bb|bePuTE DeuCTBuE');
      writeln('1 - Co3DaHue Potoka |  2 - 3aBePIIIeHuE PoToKa | 3 - 3akoH4uT KBaHT | ');
      writeln('4 - bLoKuPoBaTb | 5 - Pa3bLoKuPoBaTb | 6 - Exit');
      readln(func);
 
 
        //Действие пользователя
    {-----------------------------------------------------------------------------------}
 
           // Создание потока
           case func of
        1 : begin
                 Thead.id := ch;     // id потоку
                 Thead.status := 1;  // поток создается по умолчанию со статусом ожидание
                 if not queadd(Thead) then writeln('-----------> HeT MeCT<----------')
                 else
                   begin
                      inc(qlength); inc(ch);  //Учитываем размер очереди и id потока
                      if qlength = 1 then  que[point].status := 0;
                   end;
              if ch=MAX then ch := 0;
              end;
    {---------------------------------------------------------------------------------}
 
    {---------------------------------------------------------------------------------}
         // Завершение потока
      2 : begin temp := que[point].id;
                if not quedel(point) then writeln('----------> o4ePeDb PYcTa <---------')
                else
                   begin
                       writeln('-----> PoToK c id =', temp,' 3aBeP|||eH <-------');
                       if que[point].status <> 3 then que[point].status := 0;
                   end;
          end;
 
   {---------------------------------------------------------------------------------}
 
   {---------------------------------------------------------------------------------}
         // Закончить квант
      3 : begin
              if qlength > 0 then
               begin
                 if que[point].status <> 2 then que[point].status := 1;
                 inc(point); if point = qlength then point := 0;
                 if que[point].status <> 2 then que[point].status := 0
               end else writeln('--------> o4ePeDb PYcTa<-------');
          end;
 
   {---------------------------------------------------------------------------------}
 
   {---------------------------------------------------------------------------------}
        //Блокирование потока
 
      4 : begin
              if qlength <> 0 then
                    que[point] .status := 2
                    else writeln('------------> o4ePeDb PYcTa <---------')
          end;
 
   {---------------------------------------------------------------------------------}
 
   {---------------------------------------------------------------------------------}
         //Разблокирование потока
      5 : begin
                 if qlength <> 0 then
                  begin   if que[point].status = 2 then
                                          que[point].status := 1;
                  end
                 else writeln('-----------> o4ePeDb PYcTa <----------')
          end;
   {---------------------------------------------------------------------------------}
 
    end;
 
 
  until func = 6;
 
end.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.09.2017, 14:51
Цитата Сообщение от EpicSR Посмотреть сообщение
А скомпилировать не получиться? Паскаль.
Все тот же старый вопрос - так как выбрать блокируемый/завершаемый поток? Я так понимаю, преподу не понравилось именно это - сейчас все операции возможны только над активным потоком.
0
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
03.09.2017, 15:14
Цитата Сообщение от Renji Посмотреть сообщение
Все тот же старый вопрос - так как выбрать блокируемый/завершаемый поток? Я так понимаю, преподу не понравилось именно это - сейчас все операции возможны только над активным потоком.
Хорошо щас добавлю возможность выбора над каким потоком нужно произвести одни из 4 действий и за одно с ним разрушу свое представление что к очереди только последовательный доступ.
0
 Аватар для vlisp
1121 / 992 / 153
Регистрация: 10.08.2015
Сообщений: 5,448
03.09.2017, 17:03
Цитата Сообщение от EpicSR Посмотреть сообщение
Комментарии препода
А можно полюбопытствовать в каком заведении сей препод работает?
0
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 16
03.09.2017, 22:41  [ТС]
Добавлено через 8 минут
EpicSR,


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
Program Potok2;
 
  type                             // Еденица потока
    descriptor = record
       id : integer;               // Идентефикатор
   status : integer;  {0 - runs, 1 - wait,  2 - blok}  //Состояние
    end;
 
const MAX = 20;                    // Максимальное место в очереди
const astat : array [0..2] of string = ('runs', 'wait', 'blok');  //Служебный данные
 
 
var
        que : array [0..MAX-1]of descriptor;
        i, qnext, qindex, qlength : integer;  //Служебные данные для очереди
        Thead:descriptor;                     //Еденица потока
        func : integer;                       //Пользовательский ответ
        id : integer;
                point : integer;                      //Поток в котором управление
                temp : integer;
                ch : integer;
 
    Procedure IqueInit;                            //Служебная процедура для установки
     begin                                             //переменных по дефолту
      qnext := 0; qindex := qnext;
      qlength:=0;
     end;
 
  function queadd(eque : descriptor):boolean; {Добавление в очередь}
  begin
    queadd := true;
    if qnext < MAX then
      begin
       que[qnext] := eque;
       inc(qnext);
      end
    else queadd := false;
  end;
 
  function quedel(eque : integer):boolean;   {Удаление из очереди}
  begin
    if  qnext = 0 then quedel := false
         else    begin
                for i := eque to qlength-2 do
                   que[i] := que[i+1];
                   dec(qnext);
           dec(qlength);
                   quedel := true;
             end;
  end;
 
begin
    IqueInit;       // Установка по дефолту служебных переменных
    point := 0;     // Указатель показывающий какой поток в данный момент взял управление на себя
        ch := 0;        // Служебная переменная для нумерования(id) потока
 
 
    repeat
    for i := 0 to qlength-1 do         //Вывод состояния очереди
        begin
        write('PoTok [', que[i].id, ']   CTaTyC[', astat[que[i].status],']');
        if point = i then write(' <---- '); writeln;
        end;
 
      writeln('Bb|bePuTE DeuCTBuE');
      writeln('1 - Co3DaHue Potoka |  2 - 3aBePIIIeHuE PoToKa | 3 - 3akoH4uT KBaHT | ');
      writeln('4 - bLoKuPoBaTb | 5 - Pa3bLoKuPoBaTb | 6 - Exit');
      readln(func);
 
 
        //Действие пользователя
    {-----------------------------------------------------------------------------------}
 
           // Создание потока
           case func of
        1 : begin
                 Thead.id := ch;     // id потоку
                 Thead.status := 1;  // поток создается по умолчанию со статусом ожидание
                 if not queadd(Thead) then writeln('-----------> HeT MeCT<----------')
                 else
                   begin
                      inc(qlength); inc(ch);  //Учитываем размер очереди и id потока
                      if qlength = 1 then  que[point].status := 0;
                   end;
              if ch=MAX then ch := 0;
              end;
    {---------------------------------------------------------------------------------}
 
    {---------------------------------------------------------------------------------}
         // Завершение потока
      2 : begin temp := que[point].id;
                if not quedel(point) then writeln('----------> o4ePeDb PYcTa <---------')
                else
                   begin
                       writeln('-----> PoToK c id =', temp,' 3aBeP|||eH <-------');
                       if que[point].status <> 3 then que[point].status := 0;
                   end;
          end;
 
   {---------------------------------------------------------------------------------}
 
   {---------------------------------------------------------------------------------}
         // Закончить квант
      3 : begin
              if qlength > 0 then
               begin
                 if que[point].status <> 2 then que[point].status := 1;
                 inc(point); if point = qlength then point := 0;
                 if que[point].status <> 2 then que[point].status := 0
               end else writeln('--------> o4ePeDb PYcTa<-------');
          end;
 
   {---------------------------------------------------------------------------------}
 
   {---------------------------------------------------------------------------------}
        //Блокирование потока
 
      4 : begin
              if qlength <> 0 then
                    que[point] .status := 2
                    else writeln('------------> o4ePeDb PYcTa <---------')
          end;
 
   {---------------------------------------------------------------------------------}
 
   {---------------------------------------------------------------------------------}
         //Разблокирование потока
      5 : begin
                 if qlength <> 0 then
                  begin   if que[point].status = 2 then
                                          que[point].status := 1;
                  end
                 else writeln('-----------> o4ePeDb PYcTa <----------')
          end;
   {---------------------------------------------------------------------------------}
 
    end;
 
 
  until func = 6;
 
end.
Этот код норм? что на него перпод сказал?
0
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
04.09.2017, 08:16
Цитата Сообщение от Runinterface Посмотреть сообщение
Этот код норм? что на него перпод сказал?
На проверке еще. Я сам отпишу если что.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
05.09.2017, 12:37
Странное представление у препода о работе ОСи.
ОСь создает процессы, которые создают потоки, один или несколько, к примеру у Photoshop их 4(было в 2000 году, сейчас не знаю, может больше).
Сами процессы ведут себя, несколько иначе, количество статусов больше.
Подобный эмулятор проще делать на списках, а не массивах.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
uses Crt;
const status:array[0..4]of string=('memory runs','memory wait','load from disk','save to disk','save to disk locked');
type
  pDiscript=^tDiscript;
  tDiscript=record
    id:integer;
    st:integer;
    next:pDiscript;
    end;
var
  head,temp:pDiscript;
  kvant,i:integer;
  menu:char;
begin
  head:=nil;
  for i:=1 to 10 do
    begin
      new(temp);
      temp^.next:=head;
      temp^.id:=random(1000);
      temp^.st:=3;
      head:=temp;
    end;
  kvant:=50;
  repeat
    clrscr;
    writeln('a-add; c-close; k-kvant; l-lock; u-unlock; e-exit.');
    i:=0;
    temp:=head;
    while i<3 do
      begin
        if temp^.st<>4 then
          begin
            temp^.st:=i;
            inc(i);
          end;
        temp:=temp^.next;
      end;
    temp:=head;
    while temp<>nil do
      begin
        writeln('ID:=',temp^.id:4,'  status:=',status[temp^.st]);
        temp:=temp^.next;
      end;
    menu:=' ';
    i:=50;
    if KeyPressed then menu:=ReadKey;
    if menu in ['a','c','k','l','u']then
      case menu of
        'a':begin
              i:=kvant;
              new(temp);
              temp^.st:=3;
              temp^.id:=random(1000);
              temp^.next:=head;
              head:=temp;
              kvant:=1;
            end;
        'c':begin
              temp:=head;
              head:=head^.next;
              dispose(temp);
              kvant:=i;
            end;
        'k':begin
              kvant:=1;
            end;
        'l','u':begin
              write('enter id:=');
              readln(i);
              temp:=head;
              while(temp^.next<>nil)and(temp^.id<>i)do
                temp:=temp^.next;
              if temp^.id=i then
                if temp^.st=4 then temp^.st:=3
                  else temp^.st:=4;
              i:=50;
            end;
        end;
    dec(kvant);
    if kvant=0 then
      begin
        repeat
          temp:=head;
          if head^.st<>4 then head^.st:=3;
          while temp^.next<>nil do
            temp:=temp^.next;
          temp^.next:=head;
          head:=head^.next;
          temp^.next^.next:=nil;
        until head^.st<>4;
        kvant:=i;
      end;
    delay(100);
  until menu='e';
  while head^.next=nil do
    begin
      temp:=head;
      head:=head^.next;
      dispose(temp);
    end;
  dispose(head);
end.
1
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
05.09.2017, 13:19
Спасибо за код.
В данном заданий потоки существует только в очереди, вне очереди(вне массива их не существует) что ж поделать такая задача. И по этому процессы здесь не рассматриваются. Количество статусов может быть сколько угодно, главное что бы вразумительное количество, ни больше ни меньше.

На счет списка то да, ты прав. К сожалению это условия задачи, мягко говоря бредовые.
Это если как бы : сделать танк из дерева пользуясь только ложкой.

Пока читать твой код не буду но заметил сразу несколько ошибок и за одно обнаружил у себя ошибку с присвоением одного и того же id разным потокам.
Идентификатор не должен быть рандомным на то он и идентификатор. Например в моей проге она принимает значения от 0 до 19.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
05.09.2017, 13:59
Цитата Сообщение от EpicSR Посмотреть сообщение
Идентификатор не должен быть рандомным на то он и идентификатор
PID почти так и получается.
В некоторой системной области при запуске процесса, выделяется свободная память под описание процесса, в которой хранится вся информация о самом процессе. Обычно ОСь в PID записывает адрес начала этой области, хотя некоторые ОСи в PID пишут индекс таблицы процессов.
0
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
06.09.2017, 16:33
Значит препод принял работу и поставил 3-ку(как и ожидалось) со следующими комментариями :
Завершать квант и заканчивать работу можно только для активного потока, а у вас - и для заблокированного тоже. Это же не имеет смысла - заблокированный поток можно только разблокировать!
Почему я не расстроился из за 3 ки.
Ответ : потому что нет понятия на какой уровень абстракции рассчитывал преподаватель, то есть какие элементы можно опускать какие нет. Я на разных форумах спрашивал и везде отвечали по разному как это делать.

Мои комментарии(только на форуме, естественно я ему не писал) к комментариям преподавателя. Вообще то мне кажется для заблоченного потока только есть одно событие - это быть разблокированным.
Вообщем программа(то что я написал ) нашла свою задачу по уровню : ).
Всем огромное спасибо за помощь.Особенно Renji, Constantin Cat.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.09.2017, 16:33

CRC32, программная реализация
Привет! У кого нибудь есть пример программной реализации расчета crc32 по том же алгоритму, по котором она вычисляется аппаратно на...

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

Программная реализация номограммы
Сейчас пишу одну модель программно, в нее входят разные формулы для ее расчета, вбивать их конечно на С, не составляет никакого труда, но...

Программная реализация getchar
Добрый день! Никак не могу найти механизм работы функции getchar(). Суть в том, что нужно её использовать без подключенных...

Программная реализация дека
помогите пожалуйста!!! Программная реализация дека Указания: - использовать динамический массив - предусмотреть функции...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru