Я играл с API-интерфейсом пула потоков Windows (новым?). Я использовал пример из раздела Использование функций пула потоков и я внимательно изучил API в MSDN. Что-то я не понимаю в группах очистки.
При вызове SetThreadpoolCallbackCleanupGroup() третий параметр описывается как
Обратный вызов очистки, который будет вызываться, если группа очистки отменяется до освобождения связанного объекта. Функция вызывается при вызове
CloseThreadpoolCleanupGroupMembers().
Если я правильно понимаю, это означает, что вы можете отменить ожидающие элементы work/io/timer и попросить его вызвать функцию обратного вызова очистки для каждого из этих объектов вместо исходной очереди work/io/timer обратный вызов элемента. Это звучит круто, и я хотел бы использовать это.
К сожалению, тип 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() и др. Я совершенно не уверен, что это так.
Может ли кто-нибудь подтвердить, что эти догадки верны? Кто-нибудь использовал эту функцию раньше?