Форум программистов, компьютерный форум, киберфорум
Наши страницы
Другие языки программирования
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Curry
2991 / 2072 / 257
Регистрация: 01.06.2013
Сообщений: 4,525
Записей в блоге: 9
1

[Ada] Когда освобождать память под динамически созданную задачу?

04.07.2015, 01:38. Просмотров 961. Ответов 5
Метки нет (Все метки)

В книжке Гавва (п. 16.1.3) написано, что, если задачу создаём по new, то освобождать память надо самим через Ada.Unchecked_Deallocation . Но когда? Придумал только дожидаться циклическим опросом в вызывающем трэде T'Terminated, что, как то не очень. Может есть другие способы? К примеру, в Delphi тред сам за собой подчистить может.
Тест на Аде:
Кликните здесь для просмотра всего текста
T-SQL
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
with Ada.Text_IO;            use Ada.Text_IO;
with Ada.Unchecked_Deallocation;
 
procedure Main is
    task type Task1 is
        entry SetNum (num: in Integer);
        entry Stop;
    end Task1;
    
    task body Task1 is
        n: Integer;
    begin
        accept SetNum (num: in Integer) do
            n:=num;
            Put_Line ("SetNum " & Integer'Image(n)); 
        end SetNum;
        
        accept Stop do
            null;
        end Stop;
        Put_Line ("Task " & Integer'Image(n) & " terminated"); 
    end Task1;
    
    type tPtr is access Task1;
    type ta is array (1..10) of tPtr;
    t : ta;
    procedure FreeTask is new Ada.Unchecked_Deallocation ( Object => Task1 ,
                                                           Name => tPtr ) ;
    c : character;
    tasks_wait: Boolean := true;
begin
    for i in t'Range loop
        t(i):= new Task1;
        t(i).SetNum(i);
    end loop;
    Get(c);
    for i in t'Range loop
        t(i).Stop;
    end loop;
    while tasks_wait loop
        delay 0.1;
        tasks_wait:=false;
        for i in t'Range loop
            if t(i) /= null then
                if t(i)'Terminated then
                    FreeTask(t(i));
                else
                    tasks_wait:=true;
                end if;
            end if;
        end loop;
    end loop;
    Put_Line ("END");
end Main;
p.s. Что можно сделать просто массив задач я знаю.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2015, 01:38
Ответы с готовыми решениями:

Как и когда правильно освобождать динамически выделенную память?
Доброго времени суток! Задалась вопросом, заданным в заголовке темы "Как и когда правильно...

Как на динамически созданную панель добавить динамически созданную кнопку?
Добрый день, у меня вопрос как на динамически созданную панель добавить динамически созданную...

Заполнение структуры - стоит ли освобождать память под переменные
Здравствуйте! Пытаюсь сделать слеюдующее... Объядяю структуру такого типа: struct info { ...

Dll на C++ кушает память, как правильно удалять и освобождать память?
Добрый день, совсем мало опыта в программировании на C++, помогите пожалуйста знатоки С++. Есть...

Динамически выделить память под массив
Задание было в следующем: дан вещественный двумерный массив А. Поменять местами максимальный...

5
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
28018 / 18678 / 7361
Регистрация: 22.10.2011
Сообщений: 32,724
Записей в блоге: 6
04.07.2015, 03:12 2
Кто мешает сделать:
Oracle 11 SQL
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
WITH Ada.Text_IO; USE Ada.Text_IO;
WITH Ada.Unchecked_Deallocation;
 
PROCEDURE Main IS
   TYPE Task_Type;
   TYPE Task_Ptr IS ACCESS Task_Type;
   
   task TYPE Task_Type IS
      entry SetNum (num : INTEGER);
      entry STOP (This : IN OUT Task_Ptr);
   END Task_Type;
   
   PROCEDURE FreeTask IS NEW Ada.Unchecked_Deallocation (Object => Task_Type,
                                                         Name => Task_Ptr);
   
   task BODY Task_Type IS
      n : INTEGER;
   BEGIN
      accept SetNum (num : INTEGER) DO
         n := num;
         Put_Line ("SetNum " & INTEGER'Image (n)); 
      end SetNum;
      
      accept Stop (This : in out Task_Ptr) do
         FreeTask (This);
      end Stop;
      Put_Line ("Task " & Integer'Image (n) & " terminated"); 
   END Task_Type;
    
   TYPE Task_Array IS ARRAY (1 .. 10) OF Task_Ptr;
   t : Task_Array;
   c : Character;
BEGIN
   FOR i IN t'Range loop
      t (i) := new Task_Type;
      t (i).all.SetNum (i);
   end loop;
   Get (c);
   for i in t'RANGE LOOP
      t (i).ALL.STOP (t (i));
   END LOOP;
   
   Put_Line ("END");
END Main;
?
1
Curry
2991 / 2072 / 257
Регистрация: 01.06.2013
Сообщений: 4,525
Записей в блоге: 9
04.07.2015, 11:25  [ТС] 3
Цитата Сообщение от volvo Посмотреть сообщение
Кто мешает сделать:
То, что после освобождения памяти, задача ещё будет какое то время жить, и освобождённую память, до завершения задачи, может получить другая задача.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
28018 / 18678 / 7361
Регистрация: 22.10.2011
Сообщений: 32,724
Записей в блоге: 6
04.07.2015, 11:32 4
Лучший ответ Сообщение было отмечено KolodeznyDiver как решение

Решение

Не может. Пока задача не закончится - память не будет освобождена. Как только память будет освобождена - задача завершится. Этот способ рекомендован разработчиками языка, если что, и представлен в доках на GNAT Pro.
1
Curry
2991 / 2072 / 257
Регистрация: 01.06.2013
Сообщений: 4,525
Записей в блоге: 9
04.07.2015, 11:40  [ТС] 5
Цитата Сообщение от volvo Посмотреть сообщение
представлен в доках на GNAT Pro
Эти доки доступны? URL бы.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
28018 / 18678 / 7361
Регистрация: 22.10.2011
Сообщений: 32,724
Записей в блоге: 6
04.07.2015, 12:16 6
Нет, эти доки закрыты, распространяются только с Pro-версией среды. Но... Достаточно посмотреть на исходники (файл \adainclude\s_tassta.adb, начиная с 941-ой строки), чтобы убедиться в том, как именно задача будет уничтожена. Ну и вот сюда можно заглянуть...
2
04.07.2015, 12:16
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2015, 12:16

Динамически выделить память под массив
Добрый день форусчани Как можно выделить память под массив объекта класса class Save_Colection {...

Динамически выделить память под массив функций
QByteArray (SerfingThread::*lp_GetRequest)(const QByteArray& ,const QByteArray&); как сделать тоже...

Выделить память под двумерный массив динамически
Маюсь уже неделю, не могу выделить динамическую память под двумерный массив(чистый Си), чтобы на...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.