Программирование >>  Формирование пользовательского контейнера 

1 ... 44 45 46 [ 47 ] 48 49 50 ... 156


tenplate <class Т, int size> void GCPtr<T, size>::shutdown О {

if (gclistSizeO == 0) return; список пуст

list<GCInfo<T> >::iterator p;

#ifdef DISPLAY

cout Before collecting for shutdownO for typeid(T) .nameO \n ;

#endif

for(p = gclist.beginO; p != gclist.endO; p++) { Делает все оставшиеся счетчики ссылок нулевыми. p->refcount =0;

collectO;

#ifdef DISPLAY

cout After collecting for shutdownO for typeid(T) .nameO \n ;

#endif

Применение многопоточного сборщика мусора

Для использования многопоточного сборщика мусора включите файл gcthrd.h в ващу профамму. Затем используйте класс GCPtr как описано в главе 2. При компиляции профаммы помните о подключении многопоточных библиотек, которое описано в разделе этой главы, посвященном функциям beginthreadex() и endthreadex().

Для наблюдения за работой многопоточного сборщика мусора воспользуйтесь приведенной в листинге 3.4 версией тестовой профаммы зафузки памяти, которая первоначально была описана в главе 2.

\ Листинг 3.4. Демонстрация работы многопоточного сборщика мусора

#include <iostream> #include <new> #include gcthrd.h



ptioronoT04HOCTb У45

ing namespace std;

Простой класс для тестирования типа GCPtr. class LoadTest {

int a, b; public:

double n[100000]; просто забрать память double val;

LoadTestO { a = b = 0; )

LoadTest (int x, int y) {

a = x;

b = y; .

val = 0.0; ) *

friend ostream &operator (ostream &strm. LoadTest &obj);

Создает вставку (inserter) в поток вывода для LoadTest. ostream &operator (ostream &strm, LoadTest &obj) {

strm ( obj.a obj.b ) ;

return strm;

int mainO { GCPtr<LoadTest> np; int i;

for(i = 1; i < 2000; i++) { try {

itp = new LoadTest (i, i); if(!(i%100))

cout gclist contains np.gclistSizeО entries.\n ; } catch(bad alloc xa) {

У большинства пользователей это исключение



return 0;

Далее приводится результат прогона программы (конечно, ваш вывод может отличаться). Этот вывод программы получен при включенном макросе DISPLAY в файле gcthrd.h.

Garbage collection started.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

4 entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

3 entries.

gclist

contains

entries.

gclist

contains

entries.

gclist

contains

entries.

Before collecting for shutdovmO for class LoadTest After collecting for shutdovmO for class LoadTest

Как видите, поскольку функция collect о выполняется в фоновом режиме, список gclist никогда не становится слишком длинным, даже если тысячи объектов размещаются и теряются в памяти.

11 никогда не возникнет.

cout Last object: *пр endl;

cout Length of gclist:

np.gclistSizeO endl;



1 ... 44 45 46 [ 47 ] 48 49 50 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика