Я играл с Windows (новым?) API пула потоков. Я рассмотрел пример из Использование функций пула потоков и тщательно изучил API в MSDN. Есть кое-что, чего я не понимаю в группах по уборке.
При вызове SetThreadpoolCallbackCleanupGroup()
третий параметр описывается как
Обратный вызов очистки, который вызывается, если группа очистки отменяется до освобождения связанного объекта. Функция вызывается при вызове CloseThreadpoolCleanupGroupMembers()
.
Если мое понимание верно, это означает, что вы можете отменить ожидающие элементы work / io / timer и попросить его вызвать функцию обратного вызова очистки для каждого из этих объектов вместо исходной очереди work / io / обратный вызов элемента таймера. Это звучит круто, и я бы хотел использовать это.
К сожалению, тип PTP_CLEANUP_GROUP_CANCEL_CALLBACK
, используемый для данного обратного вызова, не задокументирован в MSDN, и рассматриваемый пример не использует эту функцию.
Взяв закон в свои руки, я проследил определение до WinNT.h
и обнаружил следующее.
typedef VOID (NTAPI *PTP_CLEANUP_GROUP_CANCEL_CALLBACK)(
__inout_opt PVOID ObjectContext,
__inout_opt PVOID CleanupContext
);
Сняв с толку это смешное заявление, вы получите:
typedef void ( __stdcall * PTP_CLEANUP_GROUP_CANCEL_CALLBACK )
( void* ObjectContext, void* CleanupContext );
Вопрос : Если вам нужно сделать обоснованное предположение, что, по вашему мнению, ObjectContext
и CleanupContext
относится к
Мое первое предположение состоит в том, что CleanupContext
- это то, что вы указываете в момент, когда вы запускаете очистку: таким образом, 3-й параметр для CloseThreadpoolCleanupGroupMembers()
. Я вполне уверен, что это предположение верно, потому что вызовы API напрямую связаны.
Мое второе предположение заключается в том, что ObjectContext
- это то, что вы указываете в момент отправки элемента work / io / timer: это второй параметр для CreateThreadpoolWork()
и др. Я абсолютно не уверен, что это так.
Может ли кто-нибудь подтвердить, что эти догадки верны? Кто-нибудь использовал эту функцию раньше?