#include #include "windows.h" #include "process.h" //#define TEST_CRT #define TEST_WINAPI #ifdef TEST_CRT #define TEST_FUNC_CREATE(c) (HANDLE)_beginthreadex (NULL, 0, (c), 0, CREATE_SUSPENDED, NULL) #define TEST_FUNC_DELETE(h) ({ if ((h)) { WaitForSingleObject ((h), INFINITE); CloseHandle ((h)); }}) #define TEST_FUNC_RESUME(h) ({ if ((h)) ResumeThread ((h)); }) #define TEST_RETURN unsigned int __stdcall #endif #ifdef TEST_WINAPI #define TEST_FUNC_CREATE(c) CreateThread (NULL, 0, (c), 0, CREATE_SUSPENDED, NULL) #define TEST_FUNC_DELETE(h) ({ if ((h)) { WaitForSingleObject ((h), INFINITE); CloseHandle ((h)); }}) #define TEST_FUNC_RESUME(h) ({ if ((h)) ResumeThread ((h)); }) #define TEST_RETURN DWORD WINAPI #endif struct Ex { }; TEST_RETURN MyCallback (void*) { try { throw Ex (); } catch (Ex&) { } return 0; } const int count = 100; const int loop = 10; int main() { HANDLE threads[count]; int i; int j; for (i = 0; i++ < loop; ) { std::cout << "Iteration #" << i << std::endl; std::cout << " Create threads..." << std::endl; for (j = 0; j++ < count; ) threads[j] = TEST_FUNC_CREATE (&MyCallback); Sleep (500); std::cout << " Resume theads..." << std::endl; for (j = 0; j++ < count; ) TEST_FUNC_RESUME (threads[j]); Sleep (500); std::cout << " Delete threads..." << std::endl; for (j = 0; j++ < count; ) TEST_FUNC_DELETE (threads[j]); Sleep (500); std::cout << " Done." << std::endl; } return 0; }