бінацію цих прапорів. Другий параметр функції HeapCreate - dwInitiallSize - визначає кількість байтів, спочатку переданих купі. При необхідності функція округлює це значення до найближчої більшої величини, кратною розміру сторінок. І останній параметр, dwMaximumSize, вказує максимальний обсяг, до якого може розширюватися купа (граничний обсяг адресного простору, зарезервованого під купу). Якщо він більше 0, ви створите купу саме такого розміру і нс зможете його збільшити. А якщо цей параметр дорівнює 0, система резервує регіон і, якщо треба, розширює його до максимально можливого обсягу. При успішному створенні купи HeapCreate повертає описувач, що ідентифікує нову купу. У своїй програмі цією функцією я створювала купу для об'єкта структури кільцевого списку.
HeapAlloc. Виділяє блок пам'яті з купи. Я використовувала цю функцію при створенні нового елемента списку. Приймає 3 параметри: параметр hHeap ідентифікує описувач купи, з якої виділяється пам'ять. Параметр dwBytes визначає число виділюваних в купі байтів. Параметр fdwFlags дозволяє вказувати прапори, що впливають на характер виділення пам'яті. В даний час підтримується тільки три прапори: HEAP_ZERO_MEMORY, HEAP_GENERATE_EXCEPTIONS і HEAP_NO_SERIALIZE. br/>
Примітка. Для виділення великих блоків пам'яті (від 1 Мб) рекомендується використовувати функцію VirtualAlloc, а не функції, які оперують з купами. br/>
- HeapFree. Служить для звільнення блоку пам'яті. У реалізованій програмі використовується при видаленні елемента. Приймає 3 параметри: параметр hHeap ідентифікує купу, а параметр pvMem повідомляє адресу блоку. Параметр fdwFlags приймає два значення: 0 або HEAP_NO_SERIALIZE.
- HeapDestroy. Знищує купу разом з усіма даними, які в ній зберігаються. Тому при її використанні необхідно упевнитися, що жоден з процесів більше не буде використовувати ці дані. В іншому випадку буде викинуто виключення або програма закінчиться некоректно. Приймає всього 1 параметр hHeap, який ідентифікує купу.
Наступні дві функції - HeapLock і HeapUnlock - використовуються парно. Вони призначені для синхронізації потоків. Після успішного виклику HeapLock потік, який викликав цю функцію, стає власником зазначеної купи. Якщо інший потік звертається до цій купі, вказуючи той же описувач купи, система призупиняє його виконання до тих пір, поки купа не буде розблокована викликом HeapUnlock. Функції HeapAlloc, HeapSize, HeapFree та інші - всі звертаються до HeapLock і HeapUnlock, щоб забезпечити послідовний доступ до купи. Тому явно в коді вони можуть бути не прописані. br/>
.3 Засоби створення потоків
Створення потоку здійснюється за допомогою наступної функції:
uintptr_t _beginthread ((* start_address) (voi...