|
Программирование >> Формирование пользовательского контейнера
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.
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;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |