ПредишенСледващото

Semaphore може да се изчисли, докато мутекс може да разчита само на 1.

Да предположим, че имате конец, който приема връзки от клиента. Този поток може едновременно да се справят с 10 клиенти. След това всеки нов клиент задава семафора, докато достигне 10. Когато Semaphore разполага с 10 знамена, потока ви няма да приеме нови връзки

Mutex обикновено се използва за защита на нещата. Да предположим, че 10-те си клиентите могат да получат достъп до някои части на системата. След това можете да защити част от системата с мутекс, така че когато един клиент е свързан с тази подсистема, никой друг не трябва да имат достъп. За тази цел можете да използвате и семафор. Mutex - това е "взаимно семафор."

За съжаление, всички пропусна най-важната разлика между мутекс и семафор; "Собственост" концепция.

Семафори нямат никаква представа за собственост, което означава, че всяка нишка може да се освободи семафора (това може да доведе до много проблеми само по себе си, но тя може да помогне с "откриването на смъртта"). Въпреки че има мутекс концепция за собственост (т.е. може да се освободи само мутекс, че сте закупили).
Имотът е изключително важно за безопасността на програмиране паралелни системи. Аз винаги препоръчваме да използвате мутекс, семафор предпочитайки (но има последици за изпълнение).

Mutexes също могат да подкрепят приоритет наследство (което би могло да помогне за решаването на проблема с приоритет инверсия) и рекурсия (с изключение на един вид заключване).

Трябва също да се отбележи, че има "двоичен" семафор и "контра / общи" семафори. Java е броене семафор семафор а и по този начин позволява на инициализира със стойност по-голяма от един (а, както е показано, на мутекс може да има само един концептуално значение). Полезността на този посочи другите позиции.

Така, да обобщим, ако не разполагате с повече средства за управление, аз винаги препоръчвам на семафор мутекс.

Mutex - това е в основата на взаимно изключване. Само една нишка може да получи ресурса веднага. Когато една нишка получава ресурса, нито една друга нишка не е позволено да придобие ресурса, докато нишката, която е собственик на ресурса няма да бъдат освободени. Всички теми, които чакат за придобиване на ресурса ще бъдат блокирани.

А семафор се използва за контрол на броя на конци. фиксиран набор от ресурси ще бъдат инсталирани. Ресурси резултат ще се намали всеки път, нишката е собственик на едни и същи. Когато броят на семафор достигне 0, няма друга нишка може да получите на ресурса. Конци са блокирани, докато други нишки няма да разполагат с необходимите ресурси.

Накратко, основната разлика се крие във факта, че колко нишки имат право да придобие веднага ресурса?

  • Mutex - има такава.
  • Semaphore - това DEFINED_COUNT, (тъй като броят на семафори)

А мутекс се използва за последователно достъп до ресурси, докато семафор ограничава достъпа до ресурса за предварително определен брой. Можете да мислите за като мутекс семафор с номера за достъп 1. Без значение какво сте задали за семафор дали потоци за достъп до ресурса преди ресурсът е заключена.

Feabhas отговор е много важно - нишка проверки мутекси се опитва да освободи мутекс всъщност го притежават. Направих го като въпрос от интервюто, така че можете да се опитате да го запомним.

Semaphore Object изпълнява синхронизация класическата светлина. контрол на трафика достъп до ресурс, общ брояч. Ако броячът е по-голяма от нула, да има достъп; Ако тя е нула, достъпът е отказан. Броячът отброява разрешение позволява достъпа до споделен ресурс. След това, за да получите достъп до потока на ресурсите, трябва да получи разрешение от светофара. Като цяло, за поток на трафика, който иска да получи достъп до общ ресурс, се опитва да получи разрешение. Ако размерът на трафик е по-голяма от нула, нишката получава разрешение, и обема на трафика намалява. В противен случай, нишката е блокиран, докато той не се получи разрешение. Когато една нишка вече не се нуждае от достъп до общ ресурс, тя освобождава резолюцията, така че размерът на увеличения трафик. Ако има друга тема в очакване на разрешение, той получава разрешение по това време. Semaforsky Java клас изпълнява този механизъм.

Semaphore има два колектора:

бр определя първоначалната сметка на резолюция. Тогава бр показва броя на потоци, които могат да имат достъп споделен ресурс в даден момент. Ако бр е равен на една, тя може едновременно да отваряте ресурс на една нишка. След като се установи как се сбъдне, можете да се гарантира, че потоците, които бихте очаквали, е било разрешено в реда, в който са поискани.

Преброяване семафор. Концептуално семафор поддържа набор от разрешителни. Всеки придобива () блокове, ако е необходимо, предварително разрешение, и след това да го взема. Всеки освобождаване () добавя разрешително, потенциално освобождаване блокиращ купувач. Въпреки това, се използват действителните обекти на разрешителното; Semaphore просто брои достъпно и действа по съответния начин.

Семафори често се използват за ограничаване на броя на нишките от достъп до някои (физически или логически) на ресурсите

Java не е вграден в API Mutex. Но това може да се реализира като двоичен семафор.

Semaphore инициализира един, и който се използва по такъв начин, че той не разполага с повече от едно разрешение на разположение, може да служи като заключване за взаимно изключване. Той е по-известен като двоичен семафор, тъй като има само две състояния: едно разрешително на разположение, или нулеви разрешителни на разположение.

Когато се използва по този начин, тя е собственост на двоичен семафор (за разлика от много ключалки реализации), които "заключване" могат да бъдат издавани поток, различен от собственика (като семафори имат концепция собственост). Това може да бъде полезно в някои специализирани контекст, като например възстановяването на застоя.

Така че основните разлики между семафор и мутекс:

Semaphore ограничава броя на потоците за достъп до ресурси. Mutex позволява само една нишка за достъп до ресурса.

Нито един от тези, които не владеят Semaphore. Теми могат да актуализират броя на разрешителните, като се обадите методи придобива () и освобождаване (). Mutexes трябва да бъдат отключени само нишката задържа заключването.

Когато мутекс се използва с променливи състояние, има мълчалив клин - ясно е, че защитената част на програмата г. Това не се отнася непременно за семафора, които могат да бъдат призовани да отидат на паралелно програмиране - е мощен, но много лесен за употреба неструктурирана, неясно начин.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!