Мутекс
Мутекс (од енглеског mutex — Mutual exclusion — узајамно искључивање) је врста промјенљиве у програмирању која се користи за спречавање истовременог приступа различитих нити истом ресурсу (меморији, уређајима, итд.).
Проблематика
уредиУ вишенитном програмирању, чест проблем је како осигурати да више нити може користити исте ресурсе, без опасности да једна нит омета приступање друге. Тако се може десити да једна нит мијења садржај меморијске локације док у исто вријеме друга нит покушава да чита тај садржај. То може довести то учитавања погрешног садржаја, погрешних резултата и, у крајњем случају, прекида рада програма.
Рјешење у облику мутекса
уредиМутекси имају улогу „катанца“. Све нити се обавезују да закључају катанац (lock
) прије него што приступе ресурсу (каже се да је нит „преузела власништво“ над ресурсом), и да га откључају (unlock
) по завршетку коришћења. У случају да је мутекс већ закључан, програмско окружење ставља нит „на чекање“. Када нит која већ посједује ресурс заврши са коришћењем и откључа мутекс, програмско окружење „пропушта“ нит која је на чекању и предаје јој власништво. Уколико има више нити на чекању, у зависности од врсте програмског окружења власништво се предаје нити која је прва покушала да преузме власништво или се предаје било којој од нити, методом насумичног избора.
Проблеми са мутексима
уредиНајчешћи проблем при коришћењу мутекса је ситуација у којој двије или више нити чекају једна на другу. Наиме, дешава се да једна нит преузме власништво над једним ресурсом, а друге над другим, а затим све покушавају да преузму власништво над једним или више туђих ресурса. На тај начин свака од нити чека да друге откључају и настаје трајно стање чекања без разрјешења.
У енглеској литератури овај случај се назива „дедлок“ (енгл. Deadlock). Рјешавање оваквих ситуација је тешко и захтијева пажљиво планирање дизајна унапријед. Током рада програма се обично манифестује блокирањем рада и потребно је покренути програм испочетка да би се са радом наставило.
Подршка у модерним програмским окружењима
уредиC и C++
уредиУ програмским језицима C и C++ не постоји подршка за мутексе, као ни за нити, него се оставља могућност постојања различитих библиотека које их омогућавају. У оперативном систему јуникс (што обухвата и друге јуниксолике системе, попут линукса) то је библиотека PThread
која нуди интерфејс у програмском језику C а по Посиксовом стандарду. Тип промјенљиве који се у овој библиотеци користи за мутексе је pthread_mutex_t
а функције које омогућавају рад са мутексима су:
pthread_mutex_init
за иницијализовање мутекса типаpthread_mutex_t
pthread_mutex_lock
за закључавањеpthread_mutex_trylock
за закључавање без могућности чекања у случају заузећа (функција се заврши са неуспјехом)pthread_mutex_unlock
за откључавањеpthread_mutex_destroy
за ослобађање меморије, тј. „одбацивање“ мутекса као промјенљиве
Виндоуз има сопствену подршку за нити у овим језицима у оквиру свог системског апликативног интерфејса, па тако и за мутексе. Популарна библиотека за програмски развој Qt нуди сопствене класе QThread
и QMutex
које се ослањају на одговарајуће системске библиотеке.
Јава
уредиЈава као језик пружа свеобухватну подршку за нити, те као таква подржава рад и са мутексима и са кондиционалним промјенљивама. У јави, међутим, за мутексе се користи термин „монитор“ који је укључен у класу Object
и, стога, постоји као уграђени атрибут у објекту било које класе. За разлику од других интерфејса гдје се контрола мутекса обавља коришћењем експлицитних функцијских позива попут „закључај“ и „откључај“, у јави се користи имплицитно закључавање коришћењем кључне ријечи synchronized
у различитим контекстима.
Види још
уредиЛитература
уреди- Michel Raynal: Algorithms for Mutual Exclusion, MIT Press, ISBN 0-262-18119-3
- Sunil R. Das, Pradip K. Srimani: Distributed Mutual Exclusion Algorithms, IEEE Computer Society, ISBN 0-8186-3380-8
- Thomas W. Christopher, George K. Thiruvathukal: High-Performance Java Platform Computing, Prentice Hall, ISBN 0-13-016164-0
- Gadi Taubenfeld, Synchronization Algorithms and Concurrent Programming, Pearson/Prentice Hall, ISBN 0-13-197259-6