PDA

نسخه کامل مشاهده نسخه کامل : چند مساله مبهم در تردینگ



Life24
10-08-2013, 01:17
با سلام
با عرض پوزش از سوال های پی در پی ! :n21:




برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

1-در کلاس بالا ما اگر به همین شکل F5 را بزنیم. Console.WriteLine("Thread one returned"); ابتدا عمل میکند . سپس print 1 تا 6 و بعد منتظر می ماند تا یک کلید از ما دریافت کند.

2-حال اگر Console.WriteLine("Thread one returned"); را از برنامه حذف کنیم. دیگر print1 تا 6 ابتدا چاپ نمیشه و منتظر میمونه من کلید بهش بدم بعد چاپ رو شروع.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

بعنی چاپ کردن دقیقا عکس بالا.


حالا در همین حالت 2 اگر ما ctrl+F5 بزنیم اون وقت دیگر اول print 1 اتا 6 عمل میکنید سپس کلید را درخواست می کند.! :n30:

4-اگر ما متد join را فعال کنیم . ترتیب رعایت میشود.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

_H2_
10-08-2013, 21:33
سلام
مورد 1 و 2 و 3 را در رایانه خودم اجرا کردم و تفاوتی در ترتیب خروجی رخ نداد!
ولی مورد 4 نیاز به آزمایش ندارد و کاملاً منطقی است.
دستور Join ریسمان جاری را بلاک میکند و منتظر میماند تا ریسمان ساخته شده کارش پایان یابد.

ولی در کل پیشنهاد میکنم برای تحقیق و بررسی چند ریسمانی اصلاً از Console.ReadXXX استفاده نکنید.
اگر میخواهید تقدم و تاخرها را چک کنید از همان Console.WriteLine استفاده کنید و ترتیب چاپ عبارت ها را مشاهده و تحقیق و بررسی کنید.
موفق باشید.

Life24
10-08-2013, 22:04
سلام
مورد 1 و 2 و 3 را در رایانه خودم اجرا کردم و تفاوتی در ترتیب خروجی رخ نداد!
ولی مورد 4 نیاز به آزمایش ندارد و کاملاً منطقی است.
دستور Join ریسمان جاری را بلاک میکند و منتظر میماند تا ریسمان ساخته شده کارش پایان یابد.

ولی در کل پیشنهاد میکنم برای تحقیق و بررسی چند ریسمانی اصلاً از Console.ReadXXX استفاده نکنید.
اگر میخواهید تقدم و تاخرها را چک کنید از همان Console.WriteLine استفاده کنید و ترتیب چاپ عبارت ها را مشاهده و تحقیق و بررسی کنید.
موفق باشید.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
منظور شما ریسمان که جوین را فراخوانی کرده است یا ریسمان اصلی برنامه که برنامه رو هدایت میکنه؟
مثلا اینجا چه لزومی داشته ما جوین رو استفاده کنیم؟

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

_H2_
10-08-2013, 22:55
سلام

منظور شما ریسمان که جوین را فراخوانی کرده است یا ریسمان اصلی برنامه که برنامه رو هدایت میکنه؟
اجازه دهید با مثالی توضیح دهیم.
در t.Join ریسمان فعلی که این دستور را اجرا کرده بلاک خواهد شد و منتظر میماند تا کار ریسمان t به انتها برسد و تمام شود.
یعنی در ریسمان جاری و سری دستورات جاری، دستور بعد t.Join وقتی اجرا خواهد شد که t تمام شده باشد.


اینجا چه لزومی داشته ما جوین رو استفاده کنیم؟
بهتر است بجای "لزوم" از کلمه "پیامد" استفاده کنیم.
که در این مثال هیچ فرقی ندارد!
چرا؟

ریسمانی که شما new کرده اید بطور پیشفرض Foreground است.
یعنی وقتی Process یا همان برنامه بخواهد تمام شود و بسته شود، منتظر میماند تا ریسمان های Foreground پایان یابند.
دستور Join چه میکند؟
منتظر میماند تا ریسمان مورد نظر پایان یابد.
((
یعنی میتوانید چنین تصور کنید که Foreground یک ریسمان مانند آن است که در آخر main روی آن ریسمان Join زده باشید!
))

به همین دلیل در این مثال شما بود و نبود Join فرقی ندارد.
ولی اگر بعد از new دستور t.IsBackground = true را اضافه کنید و t.Join را هم حذف کنید، آنگاه نمیتوان مطمئن بود همیشه همه پیام های ThreadMethod چاپ شود.

موفق باشید.