等待線程退出
主要函數:WaitForMultipleObjects
DWORD WINAPI WaitForMultipleObjects(
_In_ DWORD nCount,
_In_ const HANDLE *lpHandles,
_In_ BOOL bWaitAll,
_In_ DWORD dwMilliseconds
);
參數含義:
- 第一個參數
DWORD dwCount
爲等待的內核對象個數,可以是0到MAXIMUM_WAIT_OBJECTS(64)中的一個值。 - 第二個參數
CONST HANDLE* phObjects
爲一個存放被等待的內核對象句柄的數組 - 第三個參數
BOOL bWaitAll
是否等到所有內核對象爲已通知狀態後才返回,如果爲TRUE,則只有當等待的所有內核對象爲已通知狀態時函數才返回,如果爲FALSE,則只要一個內核對象爲已通知狀態,則該函數返回。 - 第四個參數
DWORD dwMilliseconds
爲等待時間,和WaitForSingleObject中的dwMilliseconds參數類似
#include <stdio.h>
#include <windows.h>
const unsigned int THREAD_NUM = 10;
DWORD WINAPI ThreadFunc(LPVOID);
int main()
{
printf("我是主線程, pid = %d\n", GetCurrentThreadId()); //輸出主線程pid
HANDLE hThread[THREAD_NUM];
for (int i = 0; i < THREAD_NUM; i++)
{
hThread[i] = CreateThread(NULL, 0, ThreadFunc, &i, 0, NULL); // 創建線程
}
WaitForMultipleObjects(THREAD_NUM,hThread,true, INFINITE); //一直等待,直到所有子線程全部返回
return 0;
}
DWORD WINAPI ThreadFunc(LPVOID p)
{
int n = *(int*)p;
Sleep(1000*n); //第 n 個線程睡眠 n 秒
printf("我是, pid = %d 的子線程\t", GetCurrentThreadId()); //輸出子線程pid
printf(" pid = %d 的子線程退出\n\n", GetCurrentThreadId()); //延時10s後輸出
return 0;
}