2013-07-05 3 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 и имел структуру, содержащую bool, которая задается потоком, когда это делается.

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

Смежные вопросы