- •1. Библиотеки. Статическая библиотека. Создание.
- •2. Библиотеки. Статическая библиотека. Использование.
- •3. Библиотека. Динамическая библиотека. Создание.
- •4. Библиотека. Динамическая библиотека. Статическая загрузка.
- •5. Библиотека. Динамическая библиотека. Динамическая загрузка.
- •7. Библиотеки. Динамическая библиотека. Сравнение способов загрузки.
- •8.Использование файлов при создании программы.
- •9. Позиционирование при работе с файлами. Функция.
- •10. Отображение файла на памяти. Назвать назначения параметров в функции.
- •11. Управление памятью. Для чего используется.
- •12.Блокирование памяти. В каком случае используется. Функции для блокирования.
- •13.Управление памятью. Для чего используют функции:
- •14. Для чего создаются процессы. Функции.
- •15. Назначение функций:
- •16. Асинхронный ввод/вывод:
- •17. Для чего используются потоки. Функции
- •18. Приоритеты процессов и потоков. Функции:
- •19. Синхронизация потоков. Interlocked функции. Назначение функций:
- •20. Синхронизация потоков. Критические секции. Функции.
- •21. Использование Event для синхронизации. Функции:
- •22. Использование Semaphore для синхронизации. Функции:
- •23. Использование WaitableTimerдля синхронизации. Функции:
- •24) Управление процессом. Планирование и диспетчеризация.
- •25) Использование Mutex для синхронизации. Функции.
- •26) Сравнение сегментной и страничной адресации
- •27) Страничная организация памяти.
- •29) Локальная память компьютеров. Функции
- •30. Соглашения по вызову, объяснить следующие с, срр, fastcall, stdcall. Дайте рекомендации по использованию соглашения.
19. Синхронизация потоков. Interlocked функции. Назначение функций:
При написании многопотокового приложения может понадобиться синхронизация отдельных потоков с другими частями программы. Синхронизация является компромиссом между неструктурированной природой многопотокового программирования и структурированным порядком синхронной обработки. Синхронизация используется в следующих случаях. Для явного управления порядком выполнения кода, если задачи должны выполняться в определенной последовательности либо Для предотвращения проблем, возникающих при использовании одного ресурса одновременно двумя потоками. Например, можно использовать синхронизацию, чтобы приостановить процедуру вывода информации до завершения процедуры получения данных, работающей в другом потоке.
Функции InterlockedIncrement и InterlockedDecrement выполняют, соответственно, увеличение и уменьшение на единицу значения переменной типа LONG, адрес которой передается им в качестве единственного параметра:
LONG InterlockedIncrement(LPLONG lpAddend);
LONG InterlockedDecrement(LPLONG lpAddend);
Особенностью этих функций является то, что если одна задача приступила с их помощью к изменению значения переменной, то другая задача не сможет выполнить изменение этой же переменной до тех пор, пока первая задача не завершит такое изменение.
В результате при использовании этих функций можно быть уверенным, что изменение переменной будет выполнено правильно.
LONG InterlockedExchange(
LPLONG lpTarget, // адрес изменяемой переменной
LONG lNewValue); // новое значение для переменной
Эта функция записывает значение lNewValue по адресу lpTarget. При этом гарантируется, что операция не будет прервана другой задачей, выполняющейся в рамках того же процесса.
Функция InterlockedExchange возвращает старое значение изменяемой переменной.
20. Синхронизация потоков. Критические секции. Функции.
Критическая секция (Critical Section) это участок кода, в котором поток (thread) получает доступ к ресурсу (например переменная), который доступен из других потоков.
Объект критическая секция обеспечивает синхронизацию. Этим объектом может владеть только один поток, что и обеспечивает синхронизацию. Для работы с критическими секциями есть ряд функций API и тип данных CRITICAL_SECTION. Для использования критической секции нужно создать переменную данного типа, и проинициализировать ее перед использованием с помощью функции InitializeCriticalSection(). Для того, чтобы войти в секцию нужно вызвать функцию EnterCriticalSection(), а после завершения работы LeaveCriticalSection(). Что будет, если поток обратится к секции, в которой сейчас другой поток ? Тот поток, который обратится будет блокирован пока критическая секция не будет освобождена. Саму критическую секцию можно удалить функцией DeleteCriticalSection(). Для того, чтобы обойти блокировку потока при обращении к занятой секции есть функция TryEnterCriticalSection(), которая позволяет проверить критическую секцию на занятость.
Для объявления начала критической секции используется функция.
VOID EnterCriticalSection
(
LPCRITICAL_SECTION lpCriticalSection
// указатель на переменную критическая секция
);
А для выхода из критической секции.
VOID LeaveCriticalSection
(
LPCRITICAL_SECTION lpCriticalSection
// указатель на переменную критическая секция
);
Для работы с критической секцией нам нужна переменная типа - критическай секция. Вот она:
CRITICAL_SECTION
Перед тем как использовать критическую секцию ее надо проинициализировать.
VOID InitializeCriticalSection
(
LPCRITICAL_SECTION lpCriticalSection
// указатель на переменную критическая секция
);