#include <Windows.h> #include <iostream> #include <stdlib.h>
unsigned long g_count = 0;
void NTAPI TaskHandlerMutex(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work) { WaitForSingleObject(*(HANDLE *)Context, INFINITE);
for (int x = 0; x < 100; x++) { printf("线程ID: %d ---> 子线程: %d \n", GetCurrentThreadId(), x); g_count = g_count + 1; }
ReleaseMutexWhenCallbackReturns(Instance, *(HANDLE*)Context); }
void TestMutex() { HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
PTP_WORK pool = CreateThreadpoolWork((PTP_WORK_CALLBACK)TaskHandlerMutex, &hMutex, NULL);
for (int i = 0; i < 1000; i++) { SubmitThreadpoolWork(pool); }
WaitForThreadpoolWorkCallbacks(pool, FALSE); CloseThreadpoolWork(pool); CloseHandle(hMutex);
printf("相加后 ---> %d \n", g_count); }
void NTAPI TaskHandlerKern(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work) { WaitForSingleObject(*(HANDLE *)Context, INFINITE);
for (int x = 0; x < 100; x++) { printf("线程ID: %d ---> 子线程: %d \n", GetCurrentThreadId(), x); g_count = g_count + 1; }
SetEventWhenCallbackReturns(Instance, *(HANDLE*)Context); }
void TestKern() { HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); SetEvent(hEvent);
PTP_WORK pwk = CreateThreadpoolWork((PTP_WORK_CALLBACK)TaskHandlerKern, &hEvent, NULL);
for (int i = 0; i < 1000; i++) { SubmitThreadpoolWork(pwk); }
WaitForThreadpoolWorkCallbacks(pwk, FALSE); CloseThreadpoolWork(pwk);
printf("相加后 ---> %d \n", g_count); }
void NTAPI TaskHandlerSemaphore(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work) { WaitForSingleObject(*(HANDLE *)Context, INFINITE);
for (int x = 0; x < 100; x++) { printf("线程ID: %d ---> 子线程: %d \n", GetCurrentThreadId(), x); g_count = g_count + 1; }
ReleaseSemaphoreWhenCallbackReturns(Instance, *(HANDLE*)Context, 1); }
void TestSemaphore() { HANDLE hSemaphore = CreateSemaphore(NULL, 0, 100, NULL);
ReleaseSemaphore(hSemaphore, 10, NULL);
PTP_WORK pwk = CreateThreadpoolWork((PTP_WORK_CALLBACK)TaskHandlerSemaphore, &hSemaphore, NULL);
for (int i = 0; i < 1000; i++) { SubmitThreadpoolWork(pwk); }
WaitForThreadpoolWorkCallbacks(pwk, FALSE); CloseThreadpoolWork(pwk); CloseHandle(hSemaphore);
printf("相加后 ---> %d \n", g_count); }
void NTAPI TaskHandlerLeave(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work) { EnterCriticalSection((CRITICAL_SECTION*)Context);
for (int x = 0; x < 100; x++) { printf("线程ID: %d ---> 子线程: %d \n", GetCurrentThreadId(), x); g_count = g_count + 1; }
LeaveCriticalSectionWhenCallbackReturns(Instance, (CRITICAL_SECTION*)Context); }
void TestLeave() { CRITICAL_SECTION cs; InitializeCriticalSection(&cs);
PTP_WORK pwk = CreateThreadpoolWork((PTP_WORK_CALLBACK)TaskHandlerLeave, &cs, NULL);
for (int i = 0; i < 1000; i++) { SubmitThreadpoolWork(pwk); }
WaitForThreadpoolWorkCallbacks(pwk, FALSE); DeleteCriticalSection(&cs); CloseThreadpoolWork(pwk);
printf("相加后 ---> %d \n", g_count); }
int main(int argc,char *argv) { TestLeave();
system("pause"); return 0; }
|