WaitForMultipleObjects для завершения потоков

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sn0w, 12 Dec 2009.

  1. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    вообщем простая подмена (не идеальная конечно) для WaitForMultipleObjects (когда речь идет об n потоках, причем n > MAXIMUM_WAIT_OBJECTS) и нам нужно ждать когда все они завершатся.

    Code:
    #include "stdafx.h"
    #include <conio.h>
    #include <windows.h>
    
    
    DWORD g_dwThreadsCompleted;
    CRITICAL_SECTION g_cs;
    
    //////////////////////////////////////////////////////////////////////////
    DWORD WINAPI SampleThread(LPVOID lp)
    {
    	Sleep(1000);
    
    	EnterCriticalSection(&g_cs);
    	g_dwThreadsCompleted++;
    	LeaveCriticalSection(&g_cs);
    
    	printf("thread #%d completed\n", (int)lp);
    	return 0;
    }
    
    //////////////////////////////////////////////////////////////////////////
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	InitializeCriticalSection(&g_cs);
    	g_dwThreadsCompleted = 0;
    
    	HANDLE threads[100];
    	DWORD num_threads = 100; // sizeof(threads)/sizeof(HANDLE)
    	DWORD tid;
    
    	printf("spawning and awaiting threads to be completed!\n\n");
    
    
    	for(int i=0; i<num_threads; i++)
    		threads[i] = CreateThread(0,0,SampleThread,(LPVOID)i,0,&tid);
    
    
    	// now wait for the threads will be completed
    	while(g_dwThreadsCompleted<num_threads)
    		Sleep(500);
    
    	printf("wait completed\n");
    
    	return getch();
    }
     
    #1 sn0w, 12 Dec 2009
    Last edited: 12 Dec 2009