现在的位置: 首页 > 综合 > 正文

Semaphore 的小探索

2013年06月22日 ⁄ 综合 ⁄ 共 1084字 ⁄ 字号 评论关闭

这个学期还没有讲操作系统,看多线程还真的很累,才看到Semaphore,猛然有一些思路,记下来,方便日后回来消化.

 

int main(int argc, char *argv[]) 
{    
    
int i=0;
    HANDLE hThreads[MAX_THREADS];
    hSemaphore
=CreateSemaphore(NULL,2,2,NULL);
    
    
for (;i<MAX_THREADS;i++)
    
{
        Sleep(
1000);
        hThreads[i]
=CreateThread(NULL,0,ThreadPro,(LPVOID)i,0,NULL);
    }
    return 0;
}


DWORD WINAPI ThreadPro(LPVOID n)    
{
    WaitForSingleObject(hSemaphore,INFINITE);
    printf(
"thread %d process  ",n);
    ReleaseSemaphore(hSemaphore,
1,NULL);
    
return((DWORD)n);
}

上面的代码想达到如下测试目的:即开辟三个线程。但是我想加上这个目的,假如这里我有个很破服务器,服务器上有个网页要给大家参考参考,但是服务器太破了,每次都只能支持两个用户同时访问,多了就崩了!所以我要加一个Semaphore,这样可以控制线程对该网页的访问。注意我在create一个Semaphore时 其中hSemaphore=CreateSemaphore(NULL,2,2,NULL);  我设的第三个lMaximumCount 为2,即表示最多两个线程访问该资源.

Semaphore可以参考http://shmilylff.bokee.com/2007907.html ,写得很浅显。

上面这段代码够短的了,可惜本人实在天赋不够高,每每打印出来的结果偏偏少了一个thread 2 process,如下图,查了我半个多小时。

 

开始以为是Semaphore的问题(我小白),便把所有的Semaphore相关代码都注释掉了,但是还是上述结果,后来突然想起,如果主线程在副线程结束之前就已经结束了那不是看不到线程2执行结果啦? 呵呵,我在main函数再加上了一条

WaitForMultipleObjects(3,hThreads,TRUE,INFINITE);

这句话是说等待所有其他线程都结束了,main函数才继续执行下去,否则等待。问题解决!

抱歉!评论已关闭.