大家帮我找下错误,做了好几天了,也不知错在哪儿
//实验6:生产者与消费者问题
生产者-消费者问题(producer-consumer problem)是指若干进程通过有限的共享缓冲区交换数据时的缓冲区资源使用问题。假设“生产者“进程不断向共享缓冲区写入数据(即生产数据),而“消费者“进程不断从缓冲区读出数据(即消费数据);共享缓冲区共有n个;任何时刻只能有一个进程可对共享缓冲区进行操作。所有生产者和消费者之间要协调,以完成对共享缓冲区的操作。
//************************************************************************************************
#include <iostream.h>
#include <windows.h>
#include <fstream.h>
#define count 5
struct threadinfo //定义线程信息结构
{
int threadnum;// 线程序号
char pc;// 线程类别
int persist;// 生产/消费用时
};
threadinfo newThread[5]={{1,'p',3},{2,'p',4},{3,'c',4},{4,'p',2},{5,'c',2}};//写入五个线程的信息
HANDLE MutexOfPandC; //互斥器,用于控制在任何时刻只能有一个线程可对共享
//缓冲区进行操作
HANDLE SemaphoreOfPandC;// 同步信号量
HANDLE hthread[count];// 线程句柄
int number=0;//缓冲区数量,初值赋为0
DWORD dwthreadid;
int dwthrdparam=1,i;
// ***********************************************************************
DWORD WINAPI Pthreadfunc(LPVOID n)//生产者线程函数
{
threadinfo p=*(threadinfo*)n;
cout<<"线程"<<p.threadnum<<"申请进入缓冲区"<<endl;
cout<<endl;
while(1)
{
if(WaitForSingleObject(MutexOfPandC,INFINITE)==WAIT_OBJECT_0)
//为真,生产者线程有可能进入
{
if(WaitForSingleObject(SemaphoreOfPandC,0)==WAIT_OBJECT_0)
//若为真,进入缓冲区
{
cout<<"线程"<<p.threadnum<<"进入缓冲区"<<endl;
cout<<endl;
Sleep(p.persist*1000);
cout<<"线程"<<p.threadnum<<"离开缓冲区"<<endl;
cout<<endl;
}
else// 否则释放互斥器,让其它线程进入
{ReleaseMutex(MutexOfPandC);}
ReleaseMutex(MutexOfPandC);// 释放互斥器
CloseHandle(hthread[p.threadnum]);// 关闭线程句柄
}
return 1;
}
}
//***********************************************************************
DWORD WINAPI Cthreadfunc(LPVOID n)//消费者线程函数
{
threadinfo p=*(threadinfo*)n;
cout<<"线程"<<p.threadnum<<"申请进入缓冲区"<<endl;
cout<<endl;
while(1)
{
if(WaitForSingleObject(MutexOfPandC,INFINITE)==WAIT_OBJECT_0)
// 若为真,消费者线程有可能进入
{
if(WaitForSingleObject(SemaphoreOfPandC,0)==WAIT_OBJECT_0)
//若为真,进入缓冲区
{
cout<<"线程"<<p.threadnum<<"进入缓冲区"<<endl;
cout<<endl;
Sleep(p.persist*1000);
cout<<"线程"<<p.threadnum<<"离开缓冲区"<<endl;
cout<<endl;
}
else// 否则释放互斥器,让其它线程进入
{ReleaseMutex(MutexOfPandC);}
ReleaseSemaphore(SemaphoreOfPandC,1,0);//释放信号量,信号量加1
ReleaseMutex(MutexOfPandC);// 释放互斥器
CloseHandle(hthread[p.threadnum]);// 关闭线程句柄
}
return 1;
}
}
//***********************************************************************8
void main()
{
MutexOfPandC=CreateMutex(NULL,false,NULL);//创建互斥器
SemaphoreOfPandC=CreateSemaphore(NULL,0,5,NULL);//创建信号量,当前值为0,最大值为5
ofstream myf1("e:\\class\\操作系统与系统编程\\作业\\PandC\\PandCProblem.txt");
for(i=0;i<5;i++)//多线程函数
{
myf1<<newThread[i].threadnum<<" "<<newThread]i].pc<<" "
<<newThread[i].persist<<endl;
cout<<"线程"<<newThread[i].threadnum<<"为 "<<newThread[i].pc
<<"申请进入缓冲区;"<<"在缓冲区访问 "<<newThread [i].persist<<"秒"<<endl;
cout<<endl;
if(newThread[i].pc=='P')//创建生产者线程
{
hthread[i]=CreateThread(NULL,0,Pthreadfunc,&newThread[i],0,&dwthreadid);
}
if(newThread[i].pc=='C')//创建消费者线程
{
hthread[i]=CreateThread(NULL,0,Cthreadfunc,&newThread[i],0,&dwthreadid);
}
}cin.get();
}
问题点数:0、回复次数:10Top
1 楼leyt(思维机器)回复于 2003-11-02 11:09:41 得分 0
myf1<<newThread[i].threadnum<<" "<<newThread]i].pc<<" "
中]i]写错了,应为[i]
Top
2 楼liuxueliuxue(peifu)回复于 2003-11-02 12:16:45 得分 0
有错误信息吗?大家又不是都是高手,肉眼看完要很长时间那。你应该到操作系统那里去问更好,这里都是初雪c\c+,你不是难为大家吗。我对这些也是不懂,不过你的生产者对HANDLE SemaphoreOfPandC;// 同步信号量好象没有操作,消费着每次+1,生产者应该-1把,
还有共享缓冲区共有n个;任何时刻只能有一个”线程“可对共“享缓冲区”进行操作,是不是对n个缓冲区总称,还,,
我也不懂,随便乱说的。Top
3 楼tonysjwang(青蛙王子)回复于 2003-11-02 13:09:31 得分 0
应该是存在死锁问题.
生产者在进入缓冲区后,同步信号量已减1.
任何时刻只能有一个”线程“可对“共享缓冲区”进行操作,是对n个缓冲区总称.Top
4 楼mintwlf(Programmer)回复于 2003-11-02 13:33:05 得分 0
信号量和互斥器只能用一个!
Top
5 楼tonysjwang(青蛙王子)回复于 2003-11-02 19:35:32 得分 0
我认为应该用两个,互斥器用于控制每次只有一个线程访问缓冲区.信号量用于保护对缓冲区的非法修改.我这个程序的错误就在于发生了死锁.可我找不到问题出在那里.Top
6 楼ljt198199(罗xxx)回复于 2003-11-02 21:35:00 得分 0
靠,你还得我肉眼看得红肿!!再看一下就要去配眼镜了!!Top
7 楼liuxueliuxue(peifu)回复于 2003-11-03 12:07:52 得分 0
WaitForSingleObject(SemaphoreOfPandC,0)这个喊说有什么功能,能阻塞线程吗?如果可以,那末这个程序就一定回有死锁。Top
8 楼liuxueliuxue(peifu)回复于 2003-11-03 17:42:30 得分 0
if(WaitForSingleObject(SemaphoreOfPandC,0)==WAIT_OBJECT_0) //有没有空间
{
if(WaitForSingleObject(MutexOfPandC,INFINITE)==WAIT_OBJECT_0)//有无 线程
这样也许可以,。。。。
------我是来看的,不是解题的Top
9 楼tonysjwang(青蛙王子)回复于 2003-11-03 18:46:31 得分 0
if(WaitForSingleObject(SemaphoreOfPandC,0)==WAIT_OBJECT_0)
//有无缓冲区可用,若有则进入,若无则释放互斥器,以便于其它线程进入.
Top
10 楼tonysjwang(青蛙王子)回复于 2003-11-04 16:25:46 得分 0
upTop




