PDA

View Full Version : سوال: چند سوال دررابطه با برنامه نویسی چند نخی



حامد بهرامیان
یک شنبه 01 اسفند 1395, 00:35 صبح
با سلام. لطفا دررابطه با مطلب زیر راهنماییم کنید. باتشکر

دارم الگوریتم toom-cook که الگوریتم ضرب سریع دو عدد بزرگ هست رو پیاده سازی میکنم، منتهی بخاطر سرعت بخشیدن بهش میخوام بصورت چندنخی بنویسم. تازه شروع به برنامه نویسی چند نخی کردم و چیز زیادی یاد ندارم . فقط تا حدی میدونم Lock ها چی هستن و هر thread چطور lock یک شیء رو تسخیر میکنه و synchronization بین چند نخ که روی یک منبع کار میکنن، چطور باید صورت بگیره.


توی الگوریتمی که دارم پیاده سازی میکنم، قسمتی داره که دو عدد باید بصورت یک چند جمله ای دربیان. تبدیل کردن هر عدد به چندجمله ای به عدد دیگه ربطی نداره. میخوام اینکارو بصورتی انجام بدم که تبدیل هر عدد به چندجمله ای توسط یک نخ انجام بشه. چندتا سوال برام ایجاد شده:


1. من برای تبدیل کردن، متدی ساختم مثلا با نام A که تبدیل هردو عدد داخلش صورت میگیره. وقتی داخل این متد نخ بسازم واجراش کنم، این نخ دقیقا Lock چه شیئی رو میگیره؟!


2. الگوریتم بصورت بازگشتی انجام میشه. توی این حالت، نکات مربوط به synchronization باید رعایت بشه؟ یعنی وقتی از داخل یک متد (مثلا B) که داخلش بصورت چندنخی کدشو زدم، دوباره خودش فراخوانی کنم، خطاهای starvation و deadlock بوجود میان یا ن؟


3. پایین آدرس پستی هست که در codereview ارسال کردم، منتهی کسی جواب نداده. 😓 کدم اونجاست، اگر تونستید یه نگاه بهش بندازید و. توی قسمت اطلاع رسانی به متد main هم مشکل دارم که انتهای کدم توی همون پست گفتم. لطفا بگید که ایا ساختار کدم درسته یا باید تصحیح بشه. کد (http://codereview.stackexchange.com/questions/155250/partition-numbers-as-polynomial-each-number-in-a-thread)

vahid-p
دوشنبه 02 اسفند 1395, 14:07 عصر
1. من برای تبدیل کردن، متدی ساختم مثلا با نام A که تبدیل هردو عدد داخلش صورت میگیره. وقتی داخل این متد نخ بسازم واجراش کنم، این نخ دقیقا Lock چه شیئی رو میگیره؟!
اگر منظورتون اینه متدتون رو به صورتی syncronized void myMethd() نوشتید مثلا، اونوقت اگر یک thread به این متد دسترسی پیدا کنه، اونوقت "کل آبجکت فعلی" قفل میشه.


2. الگوریتم بصورت بازگشتی انجام میشه. توی این حالت، نکات مربوط به synchronization باید رعایت بشه؟ یعنی وقتی از داخل یک متد (مثلا B) که داخلش بصورت چندنخی کدشو زدم، دوباره خودش فراخوانی کنم، خطاهای starvation و deadlock بوجود میان یا ن؟
نه، فکر نمیکنم. چون از داخل خود همون thread داره فراخوانی میشه.


3. پایین آدرس پستی هست که در codereview ارسال کردم، منتهی کسی جواب نداده. ������ کدم اونجاست، اگر تونستید یه نگاه بهش بندازید و. توی قسمت اطلاع رسانی به متد main هم مشکل دارم که انتهای کدم توی همون پست گفتم. لطفا بگید که ایا ساختار کدم درسته یا باید تصحیح بشه. کد (http://codereview.stackexchange.com/questions/155250/partition-numbers-as-polynomial-each-number-in-a-thread)



خب طرف راست گفته دیگه، تا به حال ندیدم یک کلاس رو داخل متد تعریف کنند!! اینقدر کمبود فضا دارید؟!
چند نمونه که استفاده میشه ولی بازم خیلی استفاده نمیشه، پیاده سازی برخی از متدهای یک کلاس در ایجاد آبجکت (مثلا پیاده سازی MouseListener و...)
یا کلاسهای private که داخل یک کلاس تعریف میشه.

ولی اینکه یک کلاس رو داخل یک متد تعریف کنید، خیلی خوانایی رو کاهش میده. این مشکل رو رفع کنید تا جوابتون رو بدن

حامد بهرامیان
دوشنبه 02 اسفند 1395, 19:02 عصر
ممنون از پاسختون



نه، فکر نمیکنم. چون از داخل خود همون thread داره فراخوانی میشه.

درحالت کلی کار درستی هست نخ ها بصورت تودرتو بکار گرفته بشن؟



خب طرف راست گفته دیگه، تا به حال ندیدم یک کلاس رو داخل متد تعریف کنند!! اینقدر کمبود فضا دارید؟!
نه. اصلا. اما توی آموزش های Oracle گفته شده ک اگر یک کلاس تنها قراره برای یک متد مورد استفاده قرار بگیره، بهتره که توی همون متد تعریف بشه.
از نظر شما ایرادی نداره که مثلا یک برنامه 100 کلاس داشته باشه که 60 تای اون کلاسا فقط و فقط داخل یک متد ازشون استفاده میشه؟



این مشکل رو رفع کنید تا جوابتون رو بدن
راستش دیگه ناامید شدم ازش... :ناراحت:

vahid-p
دوشنبه 02 اسفند 1395, 19:57 عصر
از نظر شما ایرادی نداره که مثلا یک برنامه 100 کلاس داشته باشه که 60 تای اون کلاسا فقط و فقط داخل یک متد ازشون استفاده میشه؟
معمولا کم پیش میاد چنین حالتی. ولی خب پیش بیاد، چه اشکالی داره.