الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Moniteur Readers/writers

مغلق
بدأه IMADIN في 16 فبراير 2008 · 10 رد · 1,466 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

السلام عليكم

التمرين عبارة عن moniteur جافا لمشكلة readers/writers

الأولوية لـ writers

on suppose que la priorité est donné aux rédacteurs qui attendent . Ainsi dès qu ' un rédacteur est disponible , tous les nouveaux lecteurs sont bloqués jusqu a ce que tous les rédacteurs auront terminés . bien sur , dans d'extremes situations cela va mener à une famine des lecteurs

المطلوب بسيط جدا وهو إكمال الكود التالي

public class ReadersWriters
{
	public synchronized  void startWrite() 
	{
		/* wait until it is ok to write */
		while(writing || waitingWriters > 0)
		{
			waitingWriters++;
			wait();
			waitingWriters--;
		}
		writing=true;
	}
	public synchronized  void stopWrite()
	{
		writing=false;
		notifyAll();	
	}
	public  synchronized void  startRead()
	{
		/*wait until it is ok to read */
		while (writing || waitingWriters > 0)
			wait();
			readers++;
	}
	public  synchronized void stopRead()
	{
		readers--;
		if(readers = 0)
			notifyAll();
	}

private  int readers = 0 ;
private  int waitingWriting = 0 ;
private boolean  writing = false ;
}

المطلوب إكمال الكود بما ينقصه وأنا عملت محاولة والتي باللون الأحمر

أرجوتصحيح الأخطاء مع الشرح

حتى وإن كان حلي خاطئ راح يكون الحل على حسب عدد الأماكن يعني لي باللون الأحمر لايكون سطر كود زائد

وعندي سؤال آخر لماذا هذه الكلاس غير مشتقة من thread

#2

لم أفهم ما كتبت

أظن أنه بالفرنسي

لو قمت بالكتابة بالعربي لوجدت المساعدة بإذن الله

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#3

أخي حتى لو كان فرنسي فأظن أنه واضح والمطلوب إكمال الكود وهو ماحاولت عمله والذي باللون الأحمر

مشكلة readerswriters الأولوية لـ writers

إذا توفر writers فهو أولى من readers الموجودين وأرجو إكمال الكود وتصحيح الأخطاء

أذكر ، على مقدار التي باللون الأحمر

#4

أين المساعدات بارك الله فيكم

#5

السلام عليكم ورحمه الله وبركاته ،

مشكله الكتابه والقرائه في نفس الكائن أو Shared Resource هي من أحد أشهر المشاكل عند التعامل مع الMultithreading ، أو بالأصح عند أراده التواصل بين هذه المسارات InterThread Communication .

المشكله أيضا تقع في نظم التشغيل عند أراده مثلا Process A أن يكتب في مثلا Stack ، وفي نفس اللحظه يكون هناك Process B يقرأ تلك البيانات في الStack ، وهنا تكون المشكله أن يقرأ B بيانات غير مستقره . في نظم التشغيل المشكله تقع تحت مسمى InterProcess Communication أختصارا IPC .

حسنا ، مع الحل في هذه اللحظه ؟

الحل يكون عن طريق وضع Monitor (فقل) معين على كل بيانات (دوال) أراد Thread معين أن يتعامل معها ، حتى لا يدخل Thread أخر في نفس اللحظه التي يكون فيها الThread الأول يجري عملياته على البيانات .

عند وضع هذا Monitor نكون قد ضمنا أن أي Thread أخر أراد الدخول عليه الأنتظار في الصف الى أن ينتهي الThread الأول ، وبعدها يدخل الThread الموجود في الصف ( يتم أختيار الThread الموجود في الصف على حسب الأولويه Priority ، وتستطيع تحديد الأولويه بالداله setPriority(here the number) ) .

ولغه جافا وفرت علينا الكثير من عناء وضع الMonitor فقط عن طريق synchronized ، وهو مشابه تماما لفكره الـ Mutex ، وهنا خيارين :

الأول عن طريق عمل داله synchronized ، والأخر عن طريق عمل synchronized statement .

نعود الأن الى سؤالك :

أولا سؤالك غير كامل أبدا ، اضافه الى وجود شروط عجيبه :

على مقدار التي باللون الأحمر

أيضا لم توضح ما هي القيمه التي يريد الThread كتابتها ، ولم توضح عدد القيم اذا كانت هناك ؟ ، ولم ولم :) .

المهم ، حليته على اعتبار انه :

private  int readers = 0;
	private  int waitingWriting = 0; 
	private boolean  writing = false;

المتغير readers أعتبرته هو القيمه التي يريد الThread الأول كتابتها ، وأيضا القيمه التي يريد الThread الثاني كتابتها .

وها هو الكلاس على هذا الأعتبار :

class ReadersWriters
{
	public synchronized  void startWrite()
 	{
		/* wait until it is ok to write */		
		while( writing ) 
		{			
			try
			{
				waitingWriting++;
				wait();
			}
			catch ( InterruptedException e)
			{	e.printStackTrace();	}
		}
		readers++;
		System.out.println("Write : " + readers);

		stopWrite();

	}

	public synchronized  void stopWrite()
	{
		writing=false;
		notifyAll();
	}	

	public  synchronized void  startRead()
	{	
		/*wait until it is ok to read */
		while ( writing )
		{
			try
			{
				wait();
			}
			catch ( InterruptedException e)
			{	e.printStackTrace();	}
		}

		System.out.println("Read : " + readers);
		stopRead();
	}

	public  synchronized void stopRead()	
	{
		if(!writing)	
			notifyAll();	
	}

	private  int readers = 0;
	private  int waitingWriting = 0;
	private boolean  writing = false;
}

اقتباس
وعندي سؤال آخر لماذا هذه الكلاس غير مشتقة من thread

لأن الكلاس ReadersWriters عباره عن فقط Resource معين ، فيه داله كتابه وقرائه فقط للبيانات وأنا أعتبرتها هنا readers وهذه الدوال تدعم التزامن synchronized سواء كتبنا Thread بعدها أم لم نكتب .

في في حال لم يتوفر لديك الكود الخاص بكلاس ما ، وأردت أستخدام الدوال التي فيه ك synchronized ، هنا بما أنك لم تستطيع الوصول للكود واضافه كلمه synchronized ، عليك باستخدام الطريقه الثانيه وهي استخدام synchronized Statment مباشره من الداله run في الـ Thread .

وها هو البرنامج كامل ، كل ما فيه كتابه قيمه ومن ثم قرائتها ، وسوف يستمر تنفيذ البرنامج الى الأبد ، أو تضغط CTRL+C حتى يتوقف التنفيذ .

class ReadersWriters
{
	public synchronized  void startWrite()
 	{
		/* wait until it is ok to write */		
		while( writing ) 
		{			
			try
			{
				waitingWriting++;
				wait();
			}
			catch ( InterruptedException e)
			{	e.printStackTrace();	}
		}
		readers++;
		System.out.println("Write : " + readers);

		stopWrite();

	}

	public synchronized  void stopWrite()
	{
		writing=false;
		notifyAll();
	}	

	public  synchronized void  startRead()
	{	
		/*wait until it is ok to read */
		while ( writing )
		{
			try
			{
				wait();
			}
			catch ( InterruptedException e)
			{	e.printStackTrace();	}
		}

		System.out.println("Read : " + readers);
		stopRead();
	}

	public  synchronized void stopRead()	
	{
		if(!writing)	
			notifyAll();	
	}

	private  int readers = 0;
	private  int waitingWriting = 0;
	private boolean  writing = false;
}

class Writer implements Runnable 
{
	ReadersWriters rw;

	public Writer (ReadersWriters r)
	{
		rw = r;
		new Thread(this,"Writer").start();
	}

	public void run ()
	{
		while ( true )
			rw.startWrite();
	}
}

class Reader implements Runnable
{
	ReadersWriters rw;

	public Reader (ReadersWriters r)
	{
		rw = r;
		new Thread(this,"Reader").start();
	}

	public void run ()
	{
		while ( true )
			rw.startRead();
	}
}

public class Demo 
{
	public static void main (String args[])
	{
		System.out.println("Press CTRL+C To Exit !");

		ReadersWriters rw = new ReadersWriters();
		Writer d1 = new Writer(rw);
		Reader d2 = new Reader(rw);


	}
}

أخيرا ، كتابه السؤال بشكل واضح ، يسرع الحصول على الأجابه الصحيحه .. تذكر ذلك في المره القادمه .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#6

أخي شكرا لك على التفاعل مع الموضوع

أنا ذكرت ان الأولوية لـ writers وأنت عملتها حسب فهمي بـ reader اعتبرته أنه القيمة التي يريد thread الأول كتابتها

ربما المشكلة في ترجمتي للسؤال فهو بالفرنسية وذكر أن الأولوية لـ writers

وذكر أن هناك العديد من readers و writers لم يبين عدد القيم التي يريد كتابتها وماهي هذه القيم

وكان المطلوب إكمال الكود فقط كما كتبته أنا باللون الأحمر

المهم أن الأولوية لـ writers

#7

................

#8

أهلا أخي ،

طبعا الأولويه للـ Thread الخاص بعمليه الكتابه Writer ، بعدها يعمل الثاني الخاص بالقرائه Reader .

والقيمه التي يقرأها أو يكتبها الThread هي Readers .

وهو بالضيط في الكود اللى أرفقته لك .

أين المشكله ؟

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#9

أخي اسمح لي بهذا السؤال ربما يكون ساذج

لماذا أضفنا readers++ في startwrite

المفروض نضيف في آخر startwrite writing=true

شيء آخر في stopread نضيف readers--

يعني لما ينتهي reader من القراءة ننقص واحد من عدد readers صح

#10

معليش يا شباب بس سؤال

ليش بضيفوا synchronized

إذا في عندنا while بتمنع حصول مشاكل

أنا مشغول اشوية بحاول أرجع للموضوع

بالنسبة للكتابة بالفرنسي في الموضوع

مخالفة للقوانين في المنتدى

وبما أن المفهوم واضح فلماذا تضعها؟؟؟

الله معكم

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#11

أخ علاء :

بنضيف synchronized حتى لا تحدث مشكله دخول أكثر من Thread في نفس الداله (في نفس الوقت) ، وهنا حنكون عملنا قفل على الداله عندما يدخل Thread اليها ، ولا يستطيع أي Thread أخر الدخول اليه حتى يتم فك القفل .

أخي IMADIN :

أنا أعتبرت startwrite بتضيف قيمه ، stopread بتطبع القيمه ، لأني ماكنت فاهم السؤال .

على العموم غير المطلوب ، وربما يكون بهذا الشكل (لم أجربه لأنه ليس لدى مترجم الأن ) .

class ReadersWriters
{
	public synchronized  void startWrite()
	{
		/* wait until it is ok to write */		
		while( writing ) 
		{			
			try
			{
				waitingWriting++;
				wait();
			}
			catch ( InterruptedException e)
			{	e.printStackTrace();	}
		}
		readers++;
		System.out.println("Write : " + readers);

		stopWrite();

	}

	public synchronized  void stopWrite()
	{
		writing=true;
		notifyAll();
	}	

	public  synchronized void  startRead()
	{	
		/*wait until it is ok to read */
		while ( !writing )
		{
			try
			{
				wait();
			}
			catch ( InterruptedException e)
			{	e.printStackTrace();	}
		}

		reader--;
		 writing = false;
		stopRead();
	}

	public  synchronized void stopRead()	
	{
		if(!writing)	
			notifyAll();	
	}

	private  int readers = 0;
	private  int waitingWriting = 0;
	private boolean  writing = false;
}

المهم أن تفهم الفكره ، والتطبيق سهل .

أي سؤال ؟

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

هذا الموضوع مغلق.