DevLab

Paralel Bank Hesabı

Orta
concurrencymultithreadingimplementation
3000 ms
256 MB

İllərlə davam edən sənədləşmə və gözləmədən sonra nəhayət bank lisenziyanızı almısınız. Bu o deməkdir ki, artıq rəsmi olaraq öz bankınızı aça bilərsiniz, ura!

İlk prioritetiniz İT sistemlərini qurub işə salmaqdır. Bir günlük gərgin əməkdən sonra artıq hesablar aça və bağlaya, həmçinin pul çıxarılması və mədaxil (deposit) əməliyyatlarını idarə edə bilirsiniz. Test yazmağa həvəsiniz olmadığı üçün dostlarınızı sistemi yoxlamağa dəvət edirsiniz. Ancaq cəmi beş dəqiqə sonra dostlarınızdan biri pul itirdiyini iddia edir! Kodunuzun qüsursuz olduğuna əmin olaraq araşdırmaq üçün logları yoxlamağa başlayırsınız.

Aha, elə şübhələndiyiniz kimi, günahkar dostunuzdur! O, test məlumatlarını başqa bir dostu ilə paylaşıb və onlar eyni vaxtda (paralel) eyni hesaba pul qoyub çıxarmağa çalışıblar. Bunu kim edər ki? Bir insanın eyni anda hesabına paralel daxil olmasının fiziki cəhətdən qeyri-mümkün olduğunu iddia etsəniz də, dostunuz bank qaydalarının bunu dəstəkləməyinizi tələb etdiyini xatırladır. Paralel bank dəstəyi yoxdursa, sistemin işə düşməsinə icazə də yoxdur. Dərindən ah çəkərək bunu sabaha saxlamağa qərar verirsiniz. Bu, açılış tarixinizi ən azı bir gün gecikdirəcək, amma nə etmək olar...

Sizin vəzifəniz hesabın açılması/bağlanması, pulun çıxarılması və mədaxili əməliyyatlarını dəstəkləyən bank hesabları sistemi yaratmaqdır. Bank hesablarına fərqli yollarla (internet, mobil telefon, avtomatik ödənişlər) daxil olmaq mümkün olduğu üçün, proqram təminatınız hesablara eyni anda bir neçə thread və ya proses vasitəsilə təhlükəsiz şəkildə daxil olmağa imkan verməlidir. Məsələn, paralel olaraq bir neçə mədaxil və məxaric (çıxarış) baş verə bilər; hesabın balansını oxuduğunuz an ilə yeni balansı təyin etdiyiniz an arasında heç bir məlumat itkisi (race condition - yarış halı) olmamasını təmin etməlisiniz.

Həmçinin, hesabı bağlamaq mümkün olmalıdır; bağlanmış hesab üzərindəki hər hansı bir əməliyyat uğursuz olmalı və xəta qaytarmalıdır.

Giriş verilənləri: Sistemə paralel thread-lər tərəfindən müxtəlif əməliyyatlar göndəriləcək; giriş axınında hər əmr ayrı sətirdə, aşağıdakı formatda (kiçik hərflərlə) gəlir:

  • open - Yeni hesab açır (balans 0 olaraq təyin edilir).

  • deposit [məbləğ] - Hesaba göstərilən məbləği əlavə edir.

  • withdraw [məbləğ] - Hesabdan göstərilən məbləği çıxarır.

  • balance - Hesabın cari balansını qaytarır.

  • close - Hesabı bağlayır.

Çıxış verilənləri:

Hər bir əməliyyatı yerinə yetirin (məsələn, balance üçün cari məbləği qaytarın).

Əgər hesab bağlanıbsa, o hesaba edilən hər hansı deposit, withdraw və ya balance sorğusu xəta (məsələn, false) qaytarmalıdır. Eyni zamanda digər bütün mümkün olmayan hallarda false qaytarmalıdır.

1Nümunə 1:
Giriş:
open deposit 100 balance
Çıxış:
100

Məhdudiyyətlər

  • Proqramda Race condition (yarış halı) yaranmamalıdır. Paralel əməliyyatlar bitdikdən sonra yekun balans riyazi olaraq tamamilə dəqiq olmalıdır.

  • Veriləcək ədədlər həqiqi ədədlərdir.

  • Hesab bağlandıqdan sonra yenidən açıla bilər.

REDAKTOR
Giriş edin
Giriş:
open balance
Çıxış:
0