GNU/Linux >> Znalost Linux >  >> Linux

pthreads mutex vs semafor

mutex se používá k zamezení sporu mezi více vlákny.

zatímco semafor se používá jako synchronizační prvek používaný ve více procesech.

mutex nelze nahradit binárním semaforem, protože jeden proces čeká na semafor, zatímco jiný proces semafor uvolňuje. V případě, že mutex je získávání i uvolňování zpracováváno stejným.


Budu mluvit o Mutex vs Binary-Semaphore. Zjevně používáte mutex, abyste zabránili tomu, aby data v jednom vlákně byla současně přístupná jinému vláknu.

(Předpokládejme, že jste právě zavolali lock() a přistupujete k datům. To znamená, že neočekáváte, že by jakékoli jiné vlákno (nebo jiná instance stejného kódu vlákna) přistupovalo ke stejným datům uzamčeným stejný mutex. To znamená, že pokud je stejný kód vlákna spuštěn v jiné instanci vlákna, zasáhne zámek, pak by lock() měla blokovat tok řízení.)

To platí pro vlákno, které používá jiný kód vlákna, které také přistupuje ke stejným datům a které je také uzamčeno stejným mutexem.

V tomto případě jste stále v procesu přístupu k datům a může vám trvat, řekněme, dalších 15 sekund, než dosáhnete odemknutí mutexu (takže se druhé vlákno, které je blokováno uzamčením mutexu, odblokovalo a umožnilo ovládání přístup k datům).

Povolili jste někdy jinému vláknu pouze odemknout stejný mutex a následně umožnit vláknu, které již čeká (blokuje se) v zámku mutexu, aby se odblokovalo a získalo přístup k datům? (Doufám, že rozumíte tomu, co zde říkám.)

Podle dohodnuté univerzální definice

  • s „mutexem“ se to stát nemůže. Žádné jiné vlákno nemůže odemknout uzamčení vašeho vlákna
  • s „binárním semaforem“ se to může stát. Zámek ve vašem vláknu může odemknout jakékoli jiné vlákno

Takže pokud jste velmi konkrétní v používání binárního semaforu místo mutexu, měli byste být velmi opatrní při „určování rozsahu“ zámků a odemykání, myslím tím, že každý ovládací tok, který zasáhne každý zámek, by měl zasáhnout volání odemknutí a také nemělo by existovat žádné „první odemknutí“, spíše by mělo být vždy „první zamknutí“.


Příklad toalety

Mutex:

Je to klíč k toaletě. Klíč může mít jedna osoba – obsadit toaletu – v tu chvíli. Po dokončení předá (uvolní) osoba klíč další osobě ve frontě.

"Mutexy se obvykle používají k serializaci přístupu k části re-entrantního kódu, kterou nelze spustit současně více než jedním vláknem. Objekt mutex umožňuje pouze jednomu vláknu vstoupit do řízené sekce, čímž nutí další vlákna, která se pokoušejí získat přístup k této sekci." počkat, dokud první vlákno opustí tuto sekci."

(Mutex je ve skutečnosti semafor s hodnotou 1.)

Semafor:

Je počet volných identických toaletních klíčů. Řekněme například, že máme čtyři toalety s identickými zámky a klíči. Počet semaforů - počet klíčů - je na začátku nastaven na 4 (všechny čtyři toalety jsou volné), pak se hodnota počtu snižuje, jak lidé přicházejí. Pokud jsou všechny toalety plné, tzn. nezůstaly žádné volné klíče, počet semaforů je 0. Nyní, když rov. jedna osoba opustí toaletu, semafor se zvýší na 1 (jeden klíč zdarma) a předá se další osobě ve frontě.

"Semafor omezuje počet současných uživatelů sdíleného zdroje až na maximální počet. Vlákna mohou žádat o přístup ke zdroji (snižování semaforu) a mohou signalizovat, že dokončili používání zdroje (zvyšování semaforu)."

Zdroj


semafory mají synchronizovaný čítač a mutexy jsou pouze binární (pravda / nepravda).

Semafor se často používá jako definitivní mechanismus pro zodpovězení toho, kolik prvků zdroje se používá – např. objekt, který představuje n pracovních vláken, může použít semafor k počítání, kolik pracovních vláken je k dispozici.

Pravdou je, že můžete reprezentovat semafor pomocí INT, který je synchronizován mutexem.


Linux
  1. Jak Linux zachraňuje pomalé počítače (a planetu)

  2. Začněte s NetworkManagerem v systému Linux

  3. Jaké unixové příkazy lze použít jako semafor/zámek?

  1. Linux – kde je uložen pojmenovaný semafor?

  2. Pthreads a Vfork?

  3. Chyba:„Identifikátor byl odstraněn:nelze získat přijatý mutex“ v protokolech chyb Apache

  1. Jak změnit limity jaderného semaforu v CentOS/RHEL

  2. Jaký je rozdíl mezi mutexem a kritickou sekcí?

  3. Jak nastavit název vlákna v Linuxu pthreads?