在Windows 2000/XP环境下,编程实现银行业务服务问题,用P、V操作实现柜台人员和顾客进程的程序

在Windows 2000/XP环境下,编程实现银行业务服务问题,用P、V操作实现柜台人员和顾客进程的程序
银行业务服务问题:银行有n个柜员负责为顾客服务,顾客进入银行先取一个号码,然后等着叫号;当某个柜员空闲下来,就叫下一个号
实现提示
•某个号码只能由一名顾客取得(互斥对象)
•不能有多于一个的柜员叫同一个号(互斥对象)
•顾客进门后,要通知柜员;有顾客的时候,柜员才叫号(同步对象)
•无柜员空闲的时候,顾客需要等待;无顾客的时候,柜员需要等待
•相应的API函数参考MSDN
这是操作系统课程设计大作业!!哪位大侠能在一个星期内给份好答案,我会加分的哦!!
注意,是操作系统!所以不能按一般编程思路去做哦!!

这是我写的程序,已经比较仔细得考虑了你的问题,不过不敢保证正确,特别是在顾客取得分配给他的号码的地方,操作系统牵涉到信号量、互斥量的题目都很难说,可能很长时间都测试不出问题。你可以测试一下。有问题可以一起讨论。
程序编译连接之后就可运行了。注意连接时需要指定使用多线程静态 LIBCMT.LIB或多线程动态库MSVCRT.LIB。

#include "stdio.h"
#include "windows.h"

#define SERVER 5 /* the number of SERVERs*/
#define CUSTOMER 200 /* the number of customer wanted to be served */
#define SERVE_TIME 1000 /* the maximal time */
#define MAX_INTERVAL 200 /* the maximal interval for a customer coming*/

int number = 0; /*initialize the number of customer is zero*/

HANDLE servers,customers; /*the semaphore of servers and waiting customers*/
HANDLE mutex;

HANDLE c[CUSTOMER],b[SERVER];

DWORD WINAPI server(PVOID pvParam)
{
while(TRUE)
{
printf("a server is waiting for customer.\n");
WaitForSingleObject(customers,INFINITE); //if there is no customer waiting, the server will go to sleep;

WaitForSingleObject(mutex,INFINITE); /* get the right to change the number of waiting_customers */
number++;
int temp=number;
ReleaseSemaphore(servers,1,NULL);
ReleaseMutex(mutex);

printf("a server is serving customer %d.\n",temp);
Sleep(SERVE_TIME);

printf("a server has finished serve customer %d.\n",temp);

}
return 0;
}

DWORD WINAPI customer(PVOID pvParam)
{
printf("A customer came.\n");
ReleaseSemaphore(customers,1,NULL);

WaitForSingleObject(servers,INFINITE);
int temp= number;
printf("Customer %d is being served.\n",temp);
return 0;
}

int main(int argc, char* argv[])
{
servers = CreateSemaphore(NULL, 0, SERVER, NULL);
customers = CreateSemaphore(NULL, 0, CUSTOMER, NULL);
mutex = CreateMutex(NULL,FALSE,NULL);

int n;
int i;
for(i=0; i<SERVER; i++)
b[i]=CreateThread(NULL,0,server,NULL,0,NULL);
for(i=0; i<CUSTOMER; i++)
{
c[i]=CreateThread(NULL,0,customer,NULL,0,NULL);
n=rand()%MAX_INTERVAL;
Sleep(n);
}

WaitForMultipleObjects(CUSTOMER,c,TRUE,INFINITE);
WaitForMultipleObjects(SERVER,b,TRUE,INFINITE);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-04-15
这个设计思路非常有想法,高效自动化业务服务智能判断接待模式,就好比拨打10086人工服务,比如1000个客服,其中900个在忙,电话会自动转接到空闲的100位客服中的其中一个业务员,1000个客服都在忙的话会提示请客户继续等待请按1
挂机请按#号键
差不多是这个意思,原理稍有区别
你可根据自己的能力,编写类似程序,自己多调试,修改,达到自己理想的智能跳转提醒程度
具体我就不多说,太复杂,
以下3个客服A,B,C 以下3个顾客X,Y,Z
当客服都空闲的时候首先来了一个顾客x
x可以选择三位空闲的客服中任意一个,假如选择了A
那么接下来又来了一个顾客Y,那么客服A在忙,顾客Y选择不了A
只能选择B或C客服,假如选择了B
接下来又来了一个顾客Z,他就只能选客服C了
选择权在谁的手上是一个问题,
1.是只能有顾客选客服
2.是客服选顾客
3.是双方都有权选择
4.是双方自由选择,系统自动分配服务对象
我想第四种可能比较大,按照10086的例子,有1200为的顾客打进电话,有200为顾客只能等待,等到有客服空闲的时候自动选择一位顾客与空闲的客服进行业务
要看具体的运作方式和自己的设计思路,进行操作,结合实施方面的问题,进行程序上的有效设计和修改.
以上纯属个人浅见,不知能否对你有所帮助
第2个回答  2009-04-16
很复杂
第3个回答  2009-04-16
很复杂``不好讲
第4个回答  2009-04-15
这很复杂
相似回答