解決什么問題
進程或線程同步
如何解決?
一個整數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存放的位置
