帮看一下代码,执行异常-关于系统进程的有关问题

帮看一下代码,执行错误---关于系统进程的问题
读者——写者问题
#include   <stdlib.h>
#include   <windows.h>
 
#include   "Reader-Writer.h "
#include   "Semaphore.h "
 
//   这是   Windows   下多线程工作的   P   操作
#define   P(S)   WaitForSingleObject(S,   INFINITE)
 
//   这是   Windows   下多线程工作的   V   操作
#define   V(S)   ReleaseSemaphore(S,   1,   NULL)
 
const   int   RN   =   5;   //   所有读者总数
const   int   WN   =   3;   //   所有写者总数
 
HANDLE   Sdoc;   //   文档信号量——互斥量
HANDLE   Sr;       //   读者信号量——广义信号量
 
HANDLE   Scnt;   //   保护   g_cntReader   的互斥量
int   g_cntReader   =   0;   //   读者个数计数器
 
//   ##############+.   Descripted   By   Tang   Houjian   [2003-9-26   20:10:49]   .+##########
//   |     funcname     :     JustWait   (   )  
//   +     note             :     显示一些信息,让后等待
//   |                              
//   +-----------------------------+
//   |     ret   val       :     void  
//   |                              
//   +     Parameter   :    
//   |                   [         int   ]   -   nReader   读者(写者)编号,读者> 0,写者 <0
//   |                   [         int   ]   -   min           操作等待的最短时间
//   |                   [         int   ]   -   max           操作等待得最长时间,实际等待的时间介于两者之间
//   |                   [   LPCSTR   ]   -   info         要显示的信息
void   JustWait(int   nReader,   int   min,   int   max,   LPCSTR   info)
//   +-----------------------------+
{
//   等待时间的基本量,以毫秒表示
const   int   BASETIME   =   1000;
 
//   实际等待得时间
int   wait_time   =   0;
if   (max==min)     //   判断是为了避免   %0错误,注意取随机值
wait_time   =   min*BASETIME;
else
wait_time   =   rand()%(max*BASETIME-min*BASETIME)   +   min*BASETIME; </P <   p>
//   最终显示的信息缓冲
char   s_out[128];
 
//   读者大于0,写者小于0
if   (nReader   >   0)
sprintf(s_out,   "Reader   [%d]:   %s\n ",   nReader,   info);
else
sprintf(s_out,   "\tWriter   [%d]:   %s\n ",   -nReader,   info);
 
//   打印
printf(s_out);
 
//   然后等待
Sleep(wait_time);
}
 
//   这是主函数
void   TryReaderAndWriter()
{
//   创建信号量             这是初值--+     +----这是最大信号量值