hSemaphore=CreateSemaphore(NULL,MaxThread,MaxThread,NULL); 
for(int i=startHost;i<=endHost;i++){
WaitForSingleObject(hSemaphore,INFINITE); 
hThread = CreateThread(NULL,0,threadPro,(LPVOID)i,0,NULL);
Sleep(SleepTime);
if(hThread!=NULL) 
CloseHandle(hThread);
}

while(1)
{
WaitForSingleObject(hSemaphore,INFINITE);
if(!ReleaseSemaphore(hSemaphore,1,&PreviousCount))
{
Sleep(5000);
break;

if(PreviousCount==(MaxThread-1)) 
{
printf("\nAll done.");
break; 

Sleep(500);
}CreateSemaphore创建的时候是信号量的计数器的个数为MaxThread,这里为200,每次WaitForSingleObject,信号量计数器减一,每次ReleaseSemaphore时候加一,上面这段代码怎么实现等待所有进程都结束了才输出"All done"呢,每个线程释放信号量代码在线程内部,如ReleaseSemaphore(hSemaphore,1,NULL)。PreviousCount是当前信号量计数器的前一个信号量,我的程序为什么到这老是为190几,到不了199,所以程序无法退出,为什么?

解决方案 »

  1.   

    for(int   i=startHost;i <=endHost;i++){ 
    WaitForSingleObject(hSemaphore,INFINITE);   
    hThread   =   CreateThread(NULL,0,threadPro,(LPVOID)i,0,NULL); 
    Sleep(SleepTime); 
    if(hThread!=NULL)   
    CloseHandle(hThread); 
    }
    ------------------------------------------------------------------
    把这个代码中的WaitForSingleObject(hSemaphore,INFINITE);去掉。
      

  2.   

    这个代码是保证同时只有MaxThread个线程在跑啊,如果去掉了,那不是开endHost-startHost个线程,一直开?如果
    endHost-startHost>200,那不是开了N个线程??
      

  3.   

    开了多少个线程没关系,只会有MaxThread个线程在运行.信号量是保证线程之间的通信的,你放在for循环中有什么意义的?
      

  4.   

    因为线程是并行运行的,要想达到199,需要所有线程恰好都已经释放了semaphore才行,这是非常小概率的事件
      

  5.   

          我的意思是放在for循环里不让他开新线程,比如说现在最大能开200个,当信号量无信号时,也就是当前线程数量已经到200个了,那么就不允许再开新线程,必须等已有的线程退出后才能开新的线程,也就是每个时刻只能有200个线程在跑。
           还有就是可以把这个代码放到线程函数的开始处,意思就是能开线程,但是当前线程已经有200个时候,线程还能开,但是线程函数里面的代码执行不了,必须等WaitForSingleObject有信号才能继续执行线程函数里的代码。
           不知道我的意思对了没?
      

  6.   

    意思对,但是和楼顶的到199有什么关系?似乎毫无关系而且你代码前面部分是创建线程的?后面是线程主函数?为什么都去waitforsingleobject?
    你的release到底是对谁release的?
      

  7.   

    这就是我不懂的地方了,这个while(1)循环里面的代码可以保证所有线程结束后输出"All done.",是别人的源码
    经过测试,是正确的,我就不知道为什么,我也不知道为什么要waitforsingleobject 2次
      

  8.   

    另外,每个线程函数的结尾都调用了ReleaseSemaphore,也就是说在线程内部释放semaphore,while循环里又是一次waitforsingleobject 和 ReleaseSemaphore,最后通过判断PreviousCount,也就是信号计数器的前一个是否等于最大计数器-1来判断线程是否全部结束,感觉有点昏。