信號量


解決什么問題
進程或線程同步

如何解決?
一個整數n,不允許小於0,小於0就會阻塞程序運行,兩個操作來控制: sem_post(3) 每次+1, sem_wait(3) 每次-1。比如初始化時候n=0, 一個線程執行sem_wait(),發現n是0,如果-1,就會小於0,但信號量不允許小於0,就等着。另一個線程執行sem_post(),將n+1,此時n==1,sem_wait()之后,n=0, 操作可以進行,第一個線程就可以繼續往后了。

信號量類型
命名信號量:進程間同步
匿名信號量:進程或線程間同步,進程間的信號量需要放到共享內存中(shmget()獲取),線程間的信號量需要放到線程都能訪問的內存(全局變量或堆中)

命名信號量
信號量名字叫: "/somename"
sem_open(3):創建或打開
sem_post(3): +1
sem_wait(3): -1,不成功會阻塞
sem_trywait(sem_t *sem): -1,不成功立刻返回,不會阻塞
sem_timedwait(sem_t *sem, const struct timespec *abs_timeout): -1,不成功會等一段時間再返回
sem_close(3): 關閉
sem_unlink(3): 刪除

匿名信號量
n存放位置需要用戶提前申請
sem_init(3): 初始化
sem_post(3): +1
sem_wait(3): -1,不成功會阻塞
sem_trywait(sem_t *sem): -1,不成功立刻返回,不會阻塞
sem_timedwait(sem_t *sem, const struct timespec *abs_timeout): -1,不成功會等一段時間再返回
sem_destroy(3): 先銷毀,用戶自己再釋放n存放的位置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM