2008.11.10 2:00
写了2小时,自己太水了,对那个东西一点都不知道,汗。。。
要看书啊!!
只看MSDN还是不行啊
2008.11.10 12:00
其实就是自己在初始化变量的时候初始化错了,我初始化为0,弄的所有的线程都进入不了临界区。。
cMutex = 1;
//创建一个最多为1的信号量,其实就是一个互斥信号量
mutex =CreateSemaphore(NULL,cMutex,cMutex,NULL);
if (mutex ==NULL)
{
printf("CreateSemaphore error: %dnn",GetLastError());
}
LONG cMax =100;
//创建一个最多100的信号量,代表最多可支持的线程数是100个
write =CreateSemaphore( NULL, 1 ,cMutex,NULL);
只有最初的初始化为1,才可以执行一次down操作让一个线程进去
down和up实际代码如下
void down(HANDLE hHandle)
{
while(WaitForSingleObject(hHandle,INFINITE) !=WAIT_OBJECT_0);
}
void up(HANDLE hHandle)
{
ReleaseSemaphore(hHandle,1,NULL);
}
读者和写者代码如下:
//Reader线程
void ReaderThread(void *p)
{
int ThreadId= ((ThreadInfo*)p)->serial;
int delay =((ThreadInfo*)p)->delay;
int persist= ((ThreadInfo*)p)->persist;
Sleep(delay*100);
printf("Id :%d, Reader sends requestn",ThreadId);
down(mutex);
readCount++;
if(readCount== 1)
down(write);
up(mutex);
![CreateSemaphore使用 semaphore使用](http://img.413yy.cn/images/31101031/31050838t015d9567f5c9c05ab3.jpg)
printf("Id :%d, Reader begin to executen",ThreadId);
Sleep(persist*100);
down(mutex);
readCount--;
if(readCount== 0)
up(write);
up(mutex);
printf("Id :%d, Reader ends executen",ThreadId);
}
//Writer线程
void WriterThread(void *p)
{
int ThreadId= ((ThreadInfo*)p)->serial;
int delay =((ThreadInfo*)p)->delay;
int persist= ((ThreadInfo*)p)->persist;
Sleep(delay*100);
printf("Id :%d, Writer sends requestn",ThreadId);
down(write);
printf("Id :%d, Writer begin to executen",ThreadId);
Sleep(persist*100);
up(write);
printf("Id :%d, Writer ends executen",ThreadId);
}