Рекурсивті mutex: бір процесте/жіпте бірнеше рет құлыптауға мүмкіндік береді, тұйыққа түсірмейді. Java синхронизациясында қолданылады. Құлыптау ережелері.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Компьютерлік ғылымда қайта кіретін мутекс (рекурсивті мутекс, рекурсивті құлып) – тұйықталуға себеп болмай, бір процесс/жіппен бірнеше рет құлыпталуы мүмкін өзара құлыптау (мутекс) механизмінің ерекше түрі. Кәдімгі мутекске (құлыпқа) «құлыптау» операциясын орындауға тырысылғанда, егер мутекс құлыпталған болса, операция сәтсіз аяқталады немесе тоқтатылады. Ал қайта кіретін мутексте бұл операция, егер және тек қана құлыптау жіпі құлыпты бұрыннан ұстап тұрса ғана сәтті аяқталады. Әдетте, қайта кіретін мутекс қанша рет құлыпталғанын есептейді және басқа жіптер оны құлыптамас бұрын, құлыптан шығару операциясын да сол санмен бірдей орындауды талап етеді.
In computer science, the reentrant mutex (recursive mutex, recursive lock) is a particular type of mutual exclusion (mutex) device that may be locked multiple times by the same process/thread, without causing a deadlock. While any attempt to perform the "lock" operation on an ordinary mutex (lock) would either fail or block when the mutex is already locked, on a recursive mutex this operation will succeed if and only if the locking thread is the one that already holds the lock. Typically, a recursive mutex tracks the number of times it has been locked, and requires equally many unlock operations to be performed before other threads may lock it.
Практикалық қолдану
W. Ричард Стивенс рекурсивті құлыптарды дұрыс қолданудың "қиын" екенін айтады және API-ды өзгертпей, бір жіпті кодты бейімдеу үшін оларды пайдалануды ұсынады, бірақ "басқа шешім болмаған жағдайда ғана". Java тілінің кіріктірілген синхрондау механизмі, монитор, рекурсивті құлыптарды қолданады. Синтаксистік тұрғыдан алғанда, құлып – "synchronized" түйін сөзінің алдында тұратын және мютекс ретінде пайдаланылатын кез келген Object сілтемесі бар код блогы. Синхрондалған блок ішінде берілген объект wait, notify немесе notifyAll арқылы шартты айнымалы ретінде қолданылуы мүмкін. Осылайша, барлық Object-ілер рекурсивті мютекс және шартты айнымалы болып табылады.
W. Richard Stevens notes that recursive locks are "tricky" to use correctly, and recommends their use for adapting single threaded code without changing APIs, but "only when no other solution is possible". The Java language's native synchronization mechanism, monitor, uses recursive locks. Syntactically, a lock is a block of code with the 'synchronized' keyword preceding it and any Object reference in parentheses that will be used as the mutex. Inside the synchronized block, the given object can be used as a condition variable by doing a wait , notify , or notifyAll on it. Thus all Objects are both recursive mutexes and condition variables.
Сатып алу
Басқару шартын иелену. Егер иесі белгіленген болса, бірақ ағымдағы жіп емес болса, бақылау шарты хабарланғанша күтіңіз (бұл да шартын босатады). Иесін ағымдағы жіпке белгілеңіз. Иесінің идентификаторы осы сәтте тазартылған болуы керек, егер иеленуші бұрыннан ие болмаса. Иелену санын арттырыңыз (жаңа иелер үшін әрқашан 1-ге тең болуы керек). Басқару шартын босатыңыз.
Acquire the control condition. If the owner is set and not the current thread, wait for the control condition to be notified (this also releases the condition). Set the owner to the current thread. The owner identifier should have already been cleared at this point unless the acquirer is already the owner. Increment the acquisition count (should always result in 1 for new owners). Release the control condition.
Шығару
Бақылау шартын иесі босатушы екенін растап алыңыз. Саны нөлден кем емес екенін растап, сатып алу санын азайтыңыз. Егер сатып алу саны нөлге тең болса, меншік иесі туралы ақпаратты жойыңыз және бақылау шартына хабарлама жіберіңіз. Бақылау шартын босатыңыз.
Acquire the control condition, asserting that the owner is the releaser. Decrement the acquisition count, asserting that the count is greater than or equal to zero. If the acquisition count is zero, clear the owner information and notify the control condition. Release the control condition.