• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья C++ Как писать асинхронные приложения. Часть 2

Triada

RAM
Пользователь
Регистрация
13.12.2019
Сообщения
127
Реакции
53
Сегодня мы рассмотрим такую вещь, как Threadpool, а конкретно WinAPI-функцию QueueUserWorkItem.
Эта функция позволяет создавать очередь. Threadpool будет выполнять переданные вами функцию по очереди.
C++:
BOOL QueueUserWorkItem(
  LPTHREAD_START_ROUTINE Function,
  PVOID                  Context,
  ULONG                  Flags
);

Function - Указатель на нашу функцию, функция должна быть обязательно такого вида:
Код:
DWORD WINAPI Function(LPVOID param){
    return 0;//в место нуля может быть то, что вам нужно
}
Context - это ваша переменная которую вы хотите передать в неё.
Flags - это дополнительные флаги которые вы хотите использовать, вот список флагов:

WT_EXECUTEDEFAULT
По умолчанию функция обратного вызова ставится в очередь в рабочий поток, не связанный с вводом-выводом.
Функция обратного вызова ставится в очередь в поток, который использует порты завершения ввода / вывода, что означает, что они не могут выполнить ожидаемое ожидание. Поэтому, если ввод-вывод завершает работу и генерирует APC, APC может ожидать неопределенно долго, поскольку нет никакой гарантии, что поток войдет в состояние ожидания с оповещением после завершения обратного вызова.

WT_EXECUTEINIOTHREAD
Этот флаг не используется.
Windows Server 2003 и Windows XP: функция обратного вызова ставится в очередь в рабочий поток ввода-вывода. Этот флаг следует использовать, если функция должна выполняться в потоке, который ожидает в состоянии оповещения.

Рабочие потоки ввода / вывода были удалены, начиная с Windows Vista и Windows Server 2008.

WT_EXECUTEINPERSISTENTTHREAD
Функция обратного вызова ставится в очередь в поток, который никогда не завершается. Это не гарантирует, что каждый раз используется один и тот же поток. Этот флаг следует использовать только для коротких задач или он может повлиять на другие операции таймера.
Этот флаг должен быть установлен, если поток вызывает функции, которые используют APC. Для получения дополнительной информации см. Асинхронные вызовы процедур .
Обратите внимание, что в настоящее время ни один рабочий поток не является действительно постоянным, хотя рабочие потоки не завершаются, если есть какие-либо ожидающие запросы ввода-вывода.

WT_EXECUTELONGFUNCTION
Функция обратного вызова может выполнить долгое ожидание. Этот флаг помогает системе решить, следует ли создавать новый поток.

WT_TRANSFER_IMPERSONATION
Функции обратного вызова будут использовать текущий токен доступа, будь то токен процесса или олицетворения. Если этот флаг не указан, функции обратного вызова выполняются только с токеном процесса.
Windows XP: этот флаг не поддерживается до Windows XP SP2 и Windows Server 2003.

Минус этой функции в том, что в неё нельзя передавать выполнение на неуправляемые части кода, т.е. с некоторыми инжектами будет проблемы
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А давайте теперь по каждой функции из винапи будем писать "статью")). Ожидаешь какие-либо лайфхаки, а тут просто выжимка из справочника по функциям.
 
А давайте теперь по каждой функции из винапи будем писать "статью")). Ожидаешь какие-либо лайфхаки, а тут просто выжимка из справочника по функциям.
Поддерживаю, такое ощущение, что тут попытка набора кармы
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх