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

سؤال عن ال Threads

بدأه djug في 9 يونيو 2008 · 6 رد · 1,078 مشاهدة · في نظام تشغيل Unix & Linux
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لنفرض أنه لدينا 2 من الـ threads

A و B

هل ترتيب إنشاء هذه الـ threads يؤثر في ترتيب execution الكود الخاص بكل واحد

بعبارة أخرى إذا أنشأنا A قبل B هل هذا يعني أن A ينهي "عمله" قبل بداية عمل B

لاحظوا معي التالي:

لدي الكود التالي:

 
if (pthread_create(&th_tst, NULL, rechercherTete,a)) 
{ 
		perror("pthread_create");

		exit(EXIT_FAILURE);

		} 





if (pthread_create(&th_tstQ, NULL, rechercherQueue,b))
 { 
		perror("pthread_create"); 

		exit(EXIT_FAILURE);

} 



pthread_join(th_tstQ,&l);



pthread_join(th_tst,&k);

لدى تشغيل هذا البرنامج فإني أحصل على نتيجة th_tst قبلth_tstQ,

و إذا عكست ترتيب إنشائهما فإني أحصل على ترتيب معاكس في النتائج

و كأنني لم أقم أصلا بإنشاء threads و قمت فقط بمناداة الـ fonctions الواحدة تلو الأخرى

سؤال آخر:

الهدف من الـ threads المذكورين فوق هو عمل بحث في جدول

الأول يقوم بالبحث من بداية الجدول إلى نهايته

و الثاني يبحث في الاتجاه المعاكس

و أريد أن أعمل التالي:

بمجرد أن يجد أحدهما النتيجة المرجوة فإنه يخبر الآخر بضرورة التوقف ( إرسال signal أو ما شابه)

فكيف يمكن عمل ذلك

#2

السلام عليكم ..

اقتباس
بعبارة أخرى إذا أنشأنا A قبل B هل هذا يعني أن A ينهي "عمله" قبل بداية عمل B

لا , إطلاقاً , فميزة الـ Thread هي جعلنا قادرين على إنشاء مهمات تعمل بالتوازي , وليس بالتوالي . لان المهمات التسلسلية يمكن اداءها بالطريقة التقليدية . طبعاً ممكن ايضاً تنفيذ مهمات على التوالي بإستخدام الـ Thread وفق نموذج الـ pipeline .

بالنسبه لبرنامج , فلكي تتضح لك الصورة اكثر , قم بإضافة تأخير قبل استدعاء pthread_join . مثلاً يمكنك إعادة كتابه الكود كالتالي :

if (pthread_create(&th_tst, NULL, rechercherTete,a))
{
		perror("pthread_create");

		exit(EXIT_FAILURE);

		}





if (pthread_create(&th_tstQ, NULL, rechercherQueue,b))
{
		perror("pthread_create");

		exit(EXIT_FAILURE);

}

 int i;
  for ( i=0; i<20; i++ ) {
	printf("Doing some tasks\n");
	sleep(1);
  }


pthread_join(th_tstQ,&l);

for ( i=0; i<30; i++ ) {
	printf("Doing some tasks again \n");
	sleep(1);
  }


pthread_join(th_tst,&k);

جرب ذلك , واعلمنا بالنتيجه ..

اقتباس
بمجرد أن يجد أحدهما النتيجة المرجوة فإنه يخبر الآخر بضرورة التوقف ( إرسال signal أو ما شابه)

في هذه الحاله يمكنك استخدام اي متغير عام كـ flag , ومن ثم القيام بفحصه في كل thread , والـ thread التي تجد النتيجه اولاً , هي التي تقوم بضبط flag . ولكن طبعاً هنا سوف تستخدم الـ mutex لضمان عدم حصول RC ..

تم تعديل هذه المشاركة بواسطة محمد معاشر في 10 يونيو 2008 في 14:21 — السبب: تعديل ..

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#3

أشكرك أخي الكريم على إجابتك

في الحقيقة بعد طرحي للسؤال بساعات صادفت كتابا ساعدني في حل المشكلة

و هي إضافة

usleep(Number)

في كود الدالة المستعملة من طرف الـ thread

أما إيقاف أحدهما للآخر فيتم بواسطة الدالة

pthread_cancel

حيث تسمح هذه الدالة بإيقاف أي thread يكون قابلا للإيقاف

#4
djug كتب:
أشكرك أخي الكريم على إجابتك

في الحقيقة بعد طرحي للسؤال بساعات صادفت كتابا ساعدني في حل المشكلة

و هي إضافة

usleep(Number)

في كود الدالة المستعملة من طرف الـ thread

أما إيقاف أحدهما للآخر فيتم بواسطة الدالة

pthread_cancel

حيث تسمح هذه الدالة بإيقاف أي thread يكون قابلا للإيقاف

جيد .

بخصوص الايقاف , ماذا لو لم ترد ايقاف الـ thread ؟ بمعنى انك تريد من الـ thread قبل ان يتوقف ان يعمل وظيفة ما , استجابة لحدث ايجاد الـ thread الاخر للنتيجه ؟

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#5
محمد معاشر كتب:
جيد .

بخصوص الايقاف , ماذا لو لم ترد ايقاف الـ thread ؟ بمعنى انك تريد من الـ thread قبل ان يتوقف ان يعمل وظيفة ما , استجابة لحدث ايجاد الـ thread الاخر للنتيجه ؟

حسب نفس الكتاب يمكن فعل ذلك

حيث أنه يمكن حفظ دوال "للتنظيف" داخل stack المخصص للـ thread بحيث أن الـ thread يقوم باستدعائها (عكس ترتيب وضعها في الـ stack ) لتحرير الذاكرة التي حجزها و للقيام بمهام آخرى في حال ما إذا استدعى الوضع ذلك

#6
djug كتب:
حسب نفس الكتاب يمكن فعل ذلك

حيث أنه يمكن حفظ دوال "للتنظيف" داخل stack المخصص للـ thread بحيث أن الـ thread يقوم باستدعائها (عكس ترتيب وضعها في الـ stack ) لتحرير الذاكرة التي حجزها و للقيام بمهام آخرى في حال ما إذا استدعى الوضع ذلك

انا قصدت ان في حاله لدينا two threads يقومان كما قلت انت بفحص مصفوفة بإتجاهين متعاكسين, اردنا مثلاً من اي thread يجد النتيجه اولاً ان يعلم الـ thread الاخر و ولا يلغية بإستخدام pthread_cancel , بل يعلمه , بحيث يقوم الـ thread الاخر مثلاً , بطباعة رساله ما ..

تم تعديل هذه المشاركة بواسطة محمد معاشر في 11 يونيو 2008 في 20:03

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#7

هو كذلك أخي الفاضل

حسب ما فهمت يكفي وضع الدالة التي تظهر النتيجة في stack الـ thread الذي يقوم بذلك

لم أجربها لكن أظن أن هذه هي الطريقة (أو طريقة من بين الطرق) التي يمكن بها عمل ذلك

مواضيع مشابهة