Мутекс

Из Википедије, слободне енциклопедије

Мутекс (од енглеског 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 у различитим контекстима.


Види још[уреди]