فصل بیست و چهارم ریسمان ها و همگام سازی #C

<!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman";} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0; mso-gutter-direction:rtl;} div.Section1 {page:Section1;} -->

            فصل بیست و چهارم

C# ریسمان ها و همگام سازی

آنچه که در این فصل یاد خواهید گرفت:

آشنایی با برنامههای چندوظیفهگی و نحوهی برنامهنویسی آنها

آشنایی با برنامهنویسی چندریسمانی

همگامسازی ریسمانها

قفل کردن منبع مختلف برای جلوگیری از دسترسی مخرب ریسمانهای همگام

کار با مانیتورها

یک مجموعه از System.Threading ریسمانها مسئول چند وظیف ه گی یک برنام ه ی کاربردی واحد هستن د . فضای نامی

کلاس ها و واس ط ها را برای مدیریت برنام ه نویسی چند ریسمانی فراهم م ی کند. احتمالاً اکثر برنام ه نویس ها هرگز نیازی به

پشتیبانی ریسمان بندی را در داخل کلا س ها بصورت انتزاعی درم ی آورد تا CLR مدیریت صریح ریسما ن ها نداشتند، چون

چندریسمانی را ساده سازد.

بخش اول این فصل نحو ه ی ایجاد، مدیریت و از بین برد ن 1 ریسمان ها را نشان می دهد. حتی اگر ریسمان های خود را صریحاً

ایجاد نکرده باشند، م ی خواهید مطمئن باشید که کد شما م ی تواند چند ریسمانی را اداره کن د . اگر در یک محیط

چندریسمانی 2 اجرا شود یا در قطعاتی که ممکن است توسط برنام ه نویسان دیگر در برنام ه های چندریسمانی استفاده شوند،

باید این ایده را در نظر گرف ت . این عمل برای توسع ه دهندگان سروی س های وب و کنترل از راه دور مهم اس ت . اگرچه

برنامه های تحت وب اکثر ویژگ ی های برنامه های رومیزی را دارند، آنها روی یک سرور اجرا م ی شوند و بایستی اید ه های

بهره وری و چندریسمانی برای آنها در نظر گرفته شود.

بخش دوم فصل روی همگا م سازی تمرکز دار د . زمانی که یک منبع محدود (مانند یک اتصال پایگاه داد ه ) دارید، ممکن است

محدود کردن دسترسی به آن منبع در یک لحظه توسط یک ریسمان لازم باشد.

یک شباهت کلاسیک، توالت هواپیما اس ت . می خواهید دسترسی به توال ت را در هر لحظه فقط برای یک نفر مجاز داری د . این

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

1 Kill

2 MultiThread

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

440

کنند. اگر در قفل شده باشد، آنها دنبال کار دیگری م ی روند یا در یک صف منتظر م یمانند. زمانی که منبع آزاد می شود، یک

فرد دیگر از صف خارج شده و منبع را م یگیرد و آن را قفل م یکند.

گاهی اوقات، ممکن است ریسما ن های متعددی بخواهند به یک منبع در برنام ه ی شما دسترسی داشته باشن د (همچون یک

فایل). شاید مهم باشد مطمئن شوید که در هر لحظه فقط یک ریسمان به منبع دسترسی د ارد و منبع خود را قفل کرده و بعد

از دستیابی یک ریسمان به آن، منبع را آزاد کنی د . قفل های برنامه نویسی با توجه به توزیع منابع م ی توانند بسیار پیچیده

باشند.

-1-24 ریسمان ها

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

را با 10 بلیون رقم اعشار حساب کنی د . بعد از شروع این محاسبه، تا زمانی که آن کار م ی کند، برنامه هیچ Pi می خواهید

خروجی به واسط کاربر نم ی نویسد. چون این محاسبه چند میلیون سال طول م ی کشد. حال ممکن است بخواهید مقدار جدید

حاصل را پردازنده در اختیار شما قرار ده د . علاوه بر این، ممکن است بخواهید یک دکمه توقف قرار دهید تا کاربر در هر

لحظه بتواند آن را متوقف ساز د . در صورتی که برنامه شما اجازه دارد کلیک روی دکمه توقف را اداره کند، شما ریسمان

اجرایی دیگری لازم دارید.

کاربرد معمول دیگر از ریسما ن بندی، در صورتی است که باید منتظر یک رویداد بمانی د : همچون ورودی کاربر، خواندن از فایل

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

خوب است و آن اجرای برنامه شما را سریع تر می سازد.

از طرف دیگر، به بعضی از شرایط توجه کنی د . ریسمان بندی می تواند سرعت اجرای برنامه را پایین بیاور د . فرض کنید

سری فیبوناجی را نیز بدست آوری د . اگر یک چند پردازنده داشته باشید، حتی اگر هر کدام ،Pi می خواهید علاوه بر محاسبه

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

قطعاً با سرعت کمتری انجام خواهد شد. چون عمل سوییچ مابین ریسمان ها انجام م یشود که یک سربار است.

-1-1-24 شروع ریسما نها

یک آرگومان از نوع Thread است. سازندهی Thread ساده ترین راه ایجاد یک ریسمان، ایجاد یک نمونه جدید از کلاس

را برای این منظور تهیه کرده است، که به متد مورد نظر شما اشاره ThreadStart کلاس نماینده CLR . نماینده می گیرد

می کند. این کلاس به شما اجازه م ی دهد، یک ریسمان ایجاد کنید و به آن بگویید "زمانی که شروع شدی، این متد را اجرا

بصورت زیر است. ThreadStart کن". اعلان نمایندهی

public delegate void ThreadStart();

void همانطور که می بینید متدی که شما به این نماینده الحاق م ی کنید، نباید پارامتری داشته باشد و مقدا ر

برمیگرداند.پس یک ریسمان جدید را بصورت زیر ایجاد میکنید.

Thread myThread = new Thread( new ThreadStart(myFunc) );

برای مثال: می خواهیم دو ریسمان ایجاد کنیم که یکی از صفر به بالا می شمارد و دیگری از 1000 به پایین می شمارد.

public void Incrementer()

{

for (int i =0;i<1000;i++)

{

Console.WriteLine("Incrementer: {0}", i);

}

فصل بیست و چهارم ریسما نها و همگام سازی

441

}

public void Decrementer()

{

for (int i = 1000;i>=0;i--)

{

Console.WriteLine("Decrementer: {0}", i);

}

}

مقداردهی ThreadStart برای اجرای این متدها در ریسمانها، دو ریسمان جدید ایجاد کنید و هرکدام را با یک نمایند ه ی

اولیه کنید. این نمایندهها در ابتدا با توابع عضو مربوطه مقداردهی اولیه م یشوند.

Thread t1 = new Thread( new ThreadStart(Incrementer) );

Thread t2 = new Thread( new ThreadStart(Decrementer) );

Thread مربوطه به شی Start با ایجاد نمون ه هایی از ریسما ن ها، اجرای آنها شروع نم ی شود. برای انجام این کار، باید متد

/ 0 نظر / 29 بازدید