Szemaforok Unixban

  adattípus műveletek használat AIX-en használat Linuxon
systemV IPC int semget
semop(sem_op=-1)
semop(sem_op=1)
semctl(IPC_RMID)
szálak és processzek szálak és processzek
POSIX szemaforok
(névtelen)
sem_t sem_init
sem_wait,sem_trywait,sem_timedwait
sem_post
sem_destroy
szálak és processzek
(1. megjegyzés)
szálak és processzek
(1. és 2. megjegyzés)
POSIX szemaforok
(névvel)
sem_t * sem_open
sem_wait
sem_post
sem_close,sem_unlink
szálak és processzek szálak és processzek
pthread pthread_mutex_t pthread_mutex_init
pthread_mutex_lock,pthread_mutex_trylock
pthread_mutex_unlock
pthread_mutex_destroy
csak szálak csak szálak
Megjegyzések:
  1. A névtelen POSIX-szemaforok akkor használhatók processzek közötti szinkronizációra, ha a processzek közös szülőtől (őstől) származnak, és a sem_init-et a szülő (ős) hajtotta végre, mégpedig úgy, hogy a pshared paramétere 1 volt.
  2. Linuxon további feltétel az is, hogy a programozónak kell gondoskodnia arról, hogy a sem_t típusú szemaforváltozó osztott memóriában legyen (lásd shmget, shm_open, mmap).
  3. Linuxon a POSIX-szemaforok és a thread-mutexek a futex rendszerhívást használják.
  4. Linux esetén a 'neves' POSIX-szemaforokat a /dev/shm könyvtárban fájlként látjuk viszont, akár ACL-t is használhatunk rajtuk.
  5. A SystemV IPC-ben az inicializálás problémásnak tűnik, mivel a 'számláló' nulla értékkel születik, ami egy már létező szemafor esetén a 'foglalt' állapotot jelezné, tehát azt is hihetnénk, hogy valaki éppen 'fogja' a szemafort, ezért meg kell várni, míg elengedi.
    Egy áthidaló megoldás: három-számlálós szemafort használunk (semget: nsems=3), az egyik az igazi szemafor, a második 1 értéke jelzi az inicializálás megtörténtét, a harmadik azért kell, mert a három fontos meseszám, mert az inicializálás három műveletből áll, de a műveletek száma nem lehet több a számlálókénál:
        sem_op op[3] = {
        0:	sem_num=1 sem_op=0 sem_flg=IPC_NOWAIT	ha már inicializáltuk, akkor itt kilépünk
        1:	sem_num=1 sem_op=1 sem_flg=IPC_NOWAIT	egyébként most megtesszük
        2:	sem_num=0 sem_op=1 sem_flg=IPC_NOWAIT	ez az igazi inicializálás
        }
    
  6. Tovább probléma az, hogy itt név helyett számmal (key_t) kell azonosítani a létrehozandó szemafort (kivéve értelmeszerűen az IPC_PRIVATE esetet); az ftok függvényt használhatjuk ilyen szám előállítására, de persze az sem lesz garantáltan egyedi.
  7. Ugyanitt az is gond lehet, hogy a szemafor nem semmisül meg automatikusan attól, hogy az összes használó folyamat kilépett. Az ipcs és ipcrm programok használhatók tájékozódásra és törlésre.
  8. Határozott előnye viszont a SEM_UNDO opció létezése: ha minden hívásnál használjuk, nem tudjuk egy hibás programfutással 'zárolt' állapotban hagyni magunk után a szemafort.
  9. Minden verzióban van 'várakozás nélküli lefoglalás' művelet (IPC_NOWAIT, sem_trywait, pthread_mutex_trylock); korlátozott idejű várakozásra csak a POSIX-szemaforoknál van lehetőség (sem_timedwait).
  10. A SystemV és POSIX szemaforok nem egy szabad/foglalt jelzőbitet, hanem egy számlálót használnak, így ha (például programhiba miatt) post után újabb post következik, a számláló értéke kettő lesz, két wait-et lehetővé téve. A mutexek esetén ez implementációfüggő, Linuxon lásd a PTHREAD_MUTEX_NORMAL, PTHREAD_MUTEX_ERRORCHECK, PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_DEFAULT opciókat.
  11. További szinkronizálási lehetőség fájlok zárolása (flock, lockf, fcntl)