2013-07-05 275 views
0
#include <stdio.h> 
#include <process.h> 
#include <wtypes.h> 
typedef unsigned int (__stdcall * THREAD_FUN_TYPE)(void *); 

int ThreadIp(void* param) 
{ 
    while(true) 
    { 
     printf("I'm runing!\n"); 
    } 
    return 0; 
} 


int main() 
{ 
    int iThreadNum=100; 
    HANDLE* phThreads = new HANDLE[iThreadNum]; 
    for (int i=0;i<iThreadNum;++i) 
    { 
     phThreads[i]=(HANDLE*)_beginthreadex(NULL, 0, (THREAD_FUN_TYPE)ThreadIp,NULL, NULL, NULL); 
    } 

    int nIndex = ::WaitForMultipleObjects(iThreadNum,phThreads,1,INFINITE); 
    printf("End!\n"); 
    return 0; 
} 

我希望該計劃將在WaitForMultipleObjects的暫停,直至所有線程都(直到所有的線程創建成功),但該程序將無法在WaitForMultipleObjects的停止,而所有線程仍在運行。所以,我嘗試使用SetEvent的,但還是同樣的問題:C++等待所有線程完成

int iThreadNum=100; 
HANDLE* phThreads = new HANDLE[iThreadNum]; 
for (int i=0;i<iThreadNum;++i) 
{ 
    phThreads[i]=CreateEvent(NULL, FALSE, FALSE,NULL); 
    ResetEvent(phThreads[i]); 
} 
int nIndex = ::WaitForMultipleObjects(iThreadNum,phThreads,1,INFINITE); 
+1

100個線程是很多線程。你的機器有多少核心? – doctorlove

+0

它有8個核心。好的,我剛剛看到你的回覆 – Gank

+0

它不會一次運行你所有的線程,然後:-) – doctorlove

回答

1

不它工作,如果你有更少的線程?該manual說,你需要做額外的工作,如果你有超過MAXIMUM_WAIT_OBJECTS,特別是

NCOUNT [中]對象句柄數在陣列由 lpHandles指向。對象句柄的最大數量爲 MAXIMUM_WAIT_OBJECTS。該參數不能爲零。

See here討論。

可能值得檢查等待函數是否返回。

+0

謝謝!線程數設置爲64,現在它運行良好。 – Gank

2

您應該等待的線程句柄,而不是無關的事件:

嘗試是這樣的:

int iThreadNum=100; 
HANDLE* phThreads = new HANDLE[iThreadNum]; 
for (int i=0;i<iThreadNum;++i) 
{ 
    m_iCurThreadNum=i; 
    phThreads[i] = _beginthreadex(...); 
    } 

int nIndex = ::WaitForMultipleObjects(iThreadNum,phThreads,1,INFINITE); 
+0

我之前使用過這個代碼,但失敗了。 – Gank

+1

什麼樣的故障?該程序不會停止在〜WaitForMultipleObjects〜?請在相應的線程函數中添加打印,並查看線程是否在很短的時間內運行。 –

+0

我編輯了這個問題。我想完成所有主題的工作,然後我可以做更多的事情。 – Gank

0

我會在調用_beginthreadex之前分配一個結構體,並通過threads參數將指針傳遞給結構體,並讓結構體包含一個由線程在完成時設置的布爾值。

struct ThreadStruct{ 
    bool Done; 
    char* ParamData; 
    int ParamDataSize; 
}; 

int ThreadIp(void* param) 
{ 
    ThreadStruct* ts = (ThreadStruct*)param; 
    while(true) 
    { 
     printf("I'm runing!\n"); 
    } 
    ts->Done = true; 
    return 0; 
} 

int main() 
{ 
    int iThreadNum=100; 
    HANDLE* phThreads = new HANDLE[iThreadNum]; 
    ThreadStruct* structs = new ThreadStruct[iThreadNum]; 
    for (int i=0;i<iThreadNum;++i) 
    { 
     ZeroMemory(structs[i], sizeof(ThreadStruct)); 
     phThreads[i]=(HANDLE*)_beginthreadex(NULL, 0, (THREAD_FUN_TYPE)ThreadIp, structs[i], NULL, NULL); 
     ResetEvent(phThreads[i]); 
    } 

    for(unsigned int i=0; i<iThreadNum;){ 
     if(!structs[i]->Done) i=0; 
     else i++; 
    } 
    printf("End!\n"); 
    return 0; 
} 
+1

效率不高。 – Gank