PDA

View Full Version : سوال: کمک درباره برنامه مساله خوانندگان و نویسندگان با سمافور



Milad.H
جمعه 25 فروردین 1391, 13:10 عصر
سلام دوستان
این کد برنامه است که در Borland
++C نوشته شده و من چند تا سوال دارم
لطفا کمک کنین :

#include<iostream.h>

[LTR_INLINE]int x=0,r=0,rw=0,ww=0,a[100],k,p;
void reader();
void writer();
void dec(int a[]);
int is0(int a[]);
void show();
void set3();
class semaphore
{
public:
int count;
int pnum;
}sem;
void wait(semaphore sem);
void signal(semaphore sem);
int main()
{
while(1)
{
cout<<"Please Enter The process Type( 1 for reader and 2 for writer ):";
cin>>p;
if(p==1)
reader();
else
if(p==2)
writer();
else
if(p==0)
{ //1
k=is0(a);
if(x>0)
x--;
else
if(k>0)
dec(a);
else
if(k==0 && rw>0)
set3();
else
if(k==0 && ww>0)
{
ww--;
x=3;
x--;
}
} // 1
else
break;
show();
}
return 0;
}
/////
void reader()
{
r++;
wait(sem);
if(x==0)
{
if(rw==0)
{
cout<<"Process Executed.\n";
a[r-1]=3;
signal(sem);
dec(a);
}
else
{
rw++;
set3();
}
}
else
if(x>0)
{
r--;
x--;
rw++;
cout<<"Process Blocked.\n";
}
k=is0(a);
}
////////////
void writer()
{ k=is0(a);
wait(sem);
if(x==0 && k==0 && rw==0)
{ cout<<"Process Execute.\n";
x=3;
signal(sem);
ww--;
x--;
}
if(x==0 && k==0 && rw>0)
{
ww++;
set3();
}
else
if(x==0 && k>0)
{
ww++;
dec(a);
}
else
if(x>0)
{
ww++;
x--;
}
}
/////////////
void dec(int a[])
{
for(int d=0;d<r;d++)
if(a[d]>0)
a[d]--;
}
////////////
int is0(int a[])
{int l=0;
for(int j=0;j<r;j++)
if(a[j]>0)
l++;
return l;
}
///////////
void show()
{ cout<<"the reader queue is: ";
for(int l=0;l<r;l++)
if(a[l]!=0)
cout<<a[l]<<" ";
cout<<"\nthe writer wait number is: "<<ww<<"\n";
cout<<"the reader wait number is: "<<rw<<"\n";
cout<<"the writer remaining time is: "<<x<<"\n\n\n";
}
//////////
void set3()
{
r=rw;
rw=0;
for(int j=0;j<r;j++)
a[j]=3;
dec(a);
}
///////////
void wait(semaphore sem)
{
sem.count--;
if(sem.count<0)
sem.pnum++;//the process blocked.
else
{sem.count++;}
}
////////////
void signal(semaphore sem)
{
sem.count++;
if(sem.count<0 )
sem.pnum--;
else
{}
}


اینجا کار s.pnum و s.count چیه؟
کار توابع is0() و ُset3() چیه؟
چرا در تمام برنامه عدد 3 استفاده شده؟(قسمت های قرمز رنگ)

Ananas
جمعه 25 فروردین 1391, 15:53 عصر
سلام.
کد c++ رو بین تگ c++که دکمش رو در قسمت نوشتن پست می تونید ببینید قرار بده. اینجوری بهتر میشه خوند.

Milad.H
جمعه 25 فروردین 1391, 17:08 عصر
ممنون از راهنمایی برای نوشتن کدها

امیدوارم کسی بنده رو راهنمایی کنه

NIMA_1981
شنبه 26 فروردین 1391, 00:59 صبح
اینها ۲ تا تابغ که کار خاصی انجام نمیده مثلا این تابع

int is0(int a[])
{int l=0;
for(int j=0;j<r;j++)
if(a[j]>0)
l++;
return l;
}


یک آرککان بصورت آرایه را میگیره بعد میاد از اول آرایه تا آخر اگه المنتی بزرگتر از صفر بود یک عدد به کنتر اضافه میکنه بعد مقدار L که همون کنتور هست رو بر میگردونه

Milad.H
شنبه 26 فروردین 1391, 11:31 صبح
خیلی ممنون
خب یعنی این دو تابع کلا کار خاصی انجام نمیدن
اما من الان کل قسمت سمافور رو حذف کردم و تمام signal و wait ها رو
باز هم برنامه کار میکنه!!
یعنی این سمافور هم کلا بیخوده؟

qwertyhossein
جمعه 16 تیر 1391, 09:31 صبح
شما توی برنامت برای خوانندگان عدد 1 و برای نویسندگان عدد 2 رو در نظر گرفتی پس یک ثایت داری که عضو خنثی هست یعنی هیچ نویسنده و خواننده ای مشغول نیست و اون ثابتت 3 هست.
در ضمن تابع is0 دنبال اونایی می گرده که توی صف هستند یعنی می گرده ببینه چندتا نویسنده و چندتا خواننده توی صف منتظرند.
شما توی تابع set3 میاین کل صف خواننده و نویسنده رو پاک می کنین چون مقدارشون رو گذاشتین 3 بعد با تابع dec میاین صفتون رو 1 واحد کاهش می دین یعنی میشن 2 پس با این کار دارین توی صفتون n تا نویسنده می ذارین که اشتباهه و اصلا به این کد نیازی نداره.