Көпағындық программалауды қолдау. Үрдістерді басқару. Жадының ұйымдастырылуы


Wait(), Pulse() және PulseAll() әдістерінің көмегімен ағындар арасында мәлімет алмасу



бет2/6
Дата09.05.2023
өлшемі83,07 Kb.
#91350
түріПрограмма
1   2   3   4   5   6

Wait(), Pulse() және PulseAll() әдістерінің көмегімен ағындар арасында мәлімет алмасу

  • Проблеманың қойылымы:
  • Т ағыны lock кодтық блогында орындалсын және ол уақытша қолжетімсіз R ресурсына қолжеткізуді қажет етсін. Егер Т ағыны R ресурсының босатылуын күту кезінде оның босағанын білу үшін ұйымдастырылған сұрастыру цикліне енетін болса, онда ағын объектіге басқа ағындардың қатынасуына бөгет болады.
  • Оңтайлы шешімі:
  • Объектіні уақытша босатып, сол арқылы басқа да ағындардың орындалуына мүмкіндік беру. Мұндай тәсіл ағындар арасындағы хабарласуға негізделеді, соның арқасында бір ағын екіншісіне оның бұғатталғаны және басқа ағынның өзінің орындалуын қайта бастауы мүмкін екендігі туралы хабарлай алады. Ағындар арасындағы хабарласу C# тілінде Wait(), Pulse() және PulseAll() әдістерінің көмегімен ұйымдастырылады.

Deadlock (өзара бұғаттау)

  • object locker1 = new object();
  • object locker2 = new object();
  • new Thread (() => {
  • lock (locker1) {
  • Thread.Sleep (1000);
  • lock (locker2); // Deadlock }
  • }).Start();
  • lock (locker2) {
  • Thread.Sleep (1000);
  • lock (locker1); // Deadlock }

Wait(), Pulse() және PulseAll() әдістерінің көмегімен ағындар арасында мәлімет алмасу

  • Wait(), Pulse() және PulseAll() әдістері Monitor класында анықталған және олар тек блоктың бұғатталған бөлігінен шақырылуы мүмкін.
  • Ағынның атқарылуы уақытша бұғатталған кезде, ол Wait() әдісін шақырады. Нәтижесінде ағын күту күйіне өтеді, ал тиісті объектіден бұғаттау алынады, осы арқылы объектіні басқа ағымда пайдалануға мүмкіндік туады.
  • Кейіннен басқа ағын бұғаттау күйіне түскенде, күтуші ағын белсенді күйге өтеді және Pulse() немесе PulseAll() әдісін шақырады. Pulse() әдісін шақыру кезінде бұғаттауды алуға өз кезегін күтетін бірінші ағын орындалады. Ал PulseAll() әдісін шақыру барлық күтетін ағындарға бұғаттаудың шешілгені туралы белгі береді.
  • Егер Wait(), Pulse() және PulseAll() әдістері синхронизацияланған кодтан тыс шақырылса, онда SynchronizationLockException аластамасы туындайды.


Достарыңызбен бөлісу:
1   2   3   4   5   6




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет