Linux学习之系统编程篇:信号量(sem_init / wait / trywait / post / destroy)
一、信號(hào)量的初步認(rèn)識(shí)
可以把信號(hào)量理解為加強(qiáng)版的互斥鎖
對(duì)于互斥鎖:
pthread_mutex_init () 初始化 一把互斥鎖后 :mutex = 1 ,代表有一把互斥鎖可用。
pthread_mutex_lock (), 加鎖 :mutex = 0 ,只有擁有鎖的線(xiàn)程(個(gè)數(shù)=1)可以訪(fǎng)問(wèn)共享數(shù)據(jù)。
pthread_mutex_unlock (),解鎖 :mutex = 1 ,其他線(xiàn)程繼續(xù)搶鎖。
這就意味著,互斥鎖實(shí)現(xiàn)的同步是串行的。
對(duì)于信號(hào)量:
其實(shí)對(duì)互斥鎖進(jìn)行了封裝,使得 mutex > 1,意味著可以允許多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)多個(gè)共享變量,即,信號(hào)量實(shí)現(xiàn)的同步是并行的。
二、信號(hào)量的相關(guān)函數(shù)
頭文件: #include <semaphore.h>
編譯需要加 -pthread
返回值(所有函數(shù)都一樣):
成功 : 0
失敗 : -1
(1)定義信號(hào)量:
(2)初始化信號(hào)量:
int sem_init(sem_t *sem, int pshared, unsigned int value);參數(shù) 1 :定義的信號(hào)量地址。
參數(shù) 2 :0 – 線(xiàn)程同步 1 – 進(jìn)程同步。
參數(shù) 3 :最多有幾個(gè) 線(xiàn)程/進(jìn)程 操作共享數(shù)據(jù)。
(3)加鎖:
注意:查看 sem 值,如果 > 0,調(diào)用一次,相當(dāng)于對(duì) sem 做減一操作(跟互斥鎖一樣)如果 sem=0,線(xiàn)程就會(huì)阻塞。
(4)嘗試加鎖:
注意:同樣,會(huì)引起 sem 做減一操作,但 sem=0 時(shí)候,線(xiàn)程不才會(huì)阻塞,會(huì)直接返回。
(5)解鎖:
(6)銷(xiāo)毀信號(hào)量:
int sem_destroy(sem_t *sem);總結(jié)
以上是生活随笔為你收集整理的Linux学习之系统编程篇:信号量(sem_init / wait / trywait / post / destroy)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网际协议:数据报格式和分片以及IPv4编
- 下一篇: Linux学习之系统编程篇:使用信号量实