2010-11-18 57 views
1

我一直在玩Windows'(新?)線程池API。我一直在關注Using the Thread Pool Functions中的示例,並且我一直在仔細研究MSDN上的API。有些東西我沒有得到關於清理組的信息。取消WIN32線程池中的計劃任務/ io /計時器項目

當調用所述SetThreadpoolCallbackCleanupGroup(),如果被解除關聯的對象之前清理組被取消該第三參數被描述爲

的清理回調被調用。當您致電CloseThreadpoolCleanupGroupMembers()時,將調用該功能。

如果我的理解是正確的,你可以取消待審批工作/ IO /定時器的項目,並要求它的方式來調用這些對象的的而不是清理回調函數原先排隊的工作/ 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); 

問題:如果你將不得不採取一個受過教育的猜測,您如何看待ObjectContextCleanupContext指什麼?

我的第一個猜測是CleanupContext是您在啓動清理時指定的內容:因此第三個參數爲CloseThreadpoolCleanupGroupMembers()。我非常有信心,這個猜測是正確的,因爲API調用是直接相關的。

我的第二個猜測是ObjectContext是您在提交工作/ io /計時器項目時指定的內容:這是CreateThreadpoolWork()等人的第二個參數。我完全不確定是這樣。

有人可以confim這些猜測是正確的嗎?有沒有人使用過這個功能?

回答

2

爲每個與調用CloseThreadpoolCleanupGroupMembers時尚未關閉的回調環境關聯的對象調用使用SetThreadpoolCallbackCleanupGroup函數指定的可選清理回調。回調的第一個參數,即對象上下文,是使用TrySubmitThreadpoolCallback,CreateThreadpoolWork等函數時指定的void *參數的值。回調函數的第二個參數cleanup context是使用CloseThreadpoolCleanupGroupMembers函數時指定的void *參數的值。

要記住的重要一點是,是否爲特定對象調用清理回調並不取決於該對象是否具有未完成的回調。只調用尚未關閉的對象。換句話說,完全有可能調用對象的回調函數,然後爲同一個對象調用清理回調函數。

例如,如果您使用CreateThreadpoolWork函數創建工作對象,並且在調用CloseThreadpoolCleanupGroupMembers之前無法調用CloseThreadpoolWork函數,那麼即使對象的回調已經執行,也會爲該對象調用清理回調。無法調用CloseThreadpoolWork不是一個bug,因爲CloseThreadpoolCleanupGroupMembers將關閉與清理組關聯的任何對象。

另一個需要注意的是使用TrySubmitThreadpoolCallback函數。這是一個更簡單的CreateThreadpoolWork版本,您不必考慮創建,提交和關閉工作對象。訣竅是線程池在執行回調後會自動關閉工作對象。這意味着如果回調仍處於掛起狀態,則只會爲此對象調用清理回調,並且在調用CloseThreadpoolCleanupGroupMembers來取消任何未決回調時指定TRUE。

+0

謝謝!在發佈問題後,我昨天進行的一個簡單測試證實了我對這些指針的猜測,但我很高興我等待了您的答案。我誤解了有關創建/提交/關閉工作對象的一些文檔,並想知道爲什麼清理是爲所有工作對象調用的。 – 2010-11-19 17:02:40