Еще проверьте, что у вас потоки реально создаются (_beginthreadex возвращает не 0) - черт его знает
Спасибо
mihaild!!! Похоже в этом и был весь корень "зла".
Сделал так:
..........
unsigned int start_time = GetTickCount(); //clock(); // начальное время
HANDLE *Th=new HANDLE[numCPU];
for (int j=0;j<numCPU;j++)
do
Th[j]=(HANDLE)_beginthreadex(NULL, 0, &select, (void *) &a[j], 0, NULL);
while (Th[j]==0);
WaitForMultipleObjects(numCPU, Th, TRUE, INFINITE);
unsigned int dT = GetTickCount()-start_time; // конечное время;clock()
printf("T=%d ms \n",dT);
..........
Вот время выполнения кода в 8 потоков на 4-х ядрах с включённым HiperThread:
T=87,14 sec
T=87,11 sec
T=87,28 sec
T=87,13 sec
T=86,98 sec
T=87,20 sec
Мало того, что это самое быстрое время из того, что было раньше, оно ещё и весьма стабильное, т.е. такое, как и должно быть по мнению
Dmitriy40.
Прихожу к такому выводу: просто _beginthreadex не всегда запускает все потоки, отсюда и нестабильное время выполнения, отсюда же и зависания, при попытке освободить HANDLE не запущенного потока.
Ну а если кто то частенько ходит помимо унитаза, вовсе не означает, что я всё время пишу по мимо массивов. Такое, конечно в теории возможно, но только в 2-х случаях: или при злоупотреблении указателями, или при отсутствии элементарных навыков программирования. И
slavav, видимо тонко намекает на второе, хотя никаких советов по существу, в отличии от других участников обсуждения, он не дал, и по поводу его квалификации у меня сложилось вполне определённое впечатление, но я, пожалуй, оставлю его при себе.