閑來無事,我給大家講下UNIX/Linux下信號量函數的使用。
首先你得知道什么叫信號量,什么時候要用信號量。
這個嘛,主要就是用來保護共享資源的,也就是說如果你想限制某個(些)資源在同一時刻只能有一(多)個線程擁有,就可以使用信號量。當然也可以用作讓一個線程等待另一個線程完成某項工作。
?
用下面一組函數(系統調用)來實現。
int sem_init(sem_t *sem,int pshared,unsigned int value);?
int sem_destroy(sem_t *sem);?
int sem_wait(sem_t *sem);?
int sem_trywait(sem_t *sem);?
int sem_post(sem_t *sem);?
int sem_getvalue(sem_t *sem);?
具體要Include什么頭文件,在你的系統上man sem_init吧。
這組函數是POSIX標準的無名信號量函數,另外還有具名信號亮,這個嘛,等下回再說。
?
看一個例子,比如有兩個線程都要往打印機上打東西,但是同一時刻只能打一個。
那么首先用sem_init初始化一個信號量,注意pshared表示允許幾個進程共享該信號量,一般設0用于進程內的多線程共享,要看是否支持進程共享,請查看下你的系統的man手冊。
第三個參數value表示可用的資源的數目,即信號燈的數目,咱們這兒只有1個打印機所以設成1。
然后線程調用sem_wait取獲取這個信號燈,第一個線程一看,有1個,他就拿到了,然后可以繼續后繼操作,此時信號燈自動減1,變成0個。那么第二個線程調用sem_wait時就會阻塞在這兒了。
第一個線程完成打印后,調用sem_post釋放信號燈,信號燈數目變成1,將會喚醒等待的第二個線程,然后第二個線程接著打印。
最后當所有任務完成后,主線程調用sem_destroy釋放這個信號量。
?
OK?
另外幾個函數sem_trywait ,顧名思義,望文生義,就是測試一下看看現在有沒有可用的信號燈,而不會阻塞。
sem_getvalue嘛就是讀取當前的信號燈的數目。
首先你得知道什么叫信號量,什么時候要用信號量。
這個嘛,主要就是用來保護共享資源的,也就是說如果你想限制某個(些)資源在同一時刻只能有一(多)個線程擁有,就可以使用信號量。當然也可以用作讓一個線程等待另一個線程完成某項工作。
?
用下面一組函數(系統調用)來實現。
int sem_init(sem_t *sem,int pshared,unsigned int value);?
int sem_destroy(sem_t *sem);?
int sem_wait(sem_t *sem);?
int sem_trywait(sem_t *sem);?
int sem_post(sem_t *sem);?
int sem_getvalue(sem_t *sem);?
具體要Include什么頭文件,在你的系統上man sem_init吧。
這組函數是POSIX標準的無名信號量函數,另外還有具名信號亮,這個嘛,等下回再說。
?
看一個例子,比如有兩個線程都要往打印機上打東西,但是同一時刻只能打一個。
那么首先用sem_init初始化一個信號量,注意pshared表示允許幾個進程共享該信號量,一般設0用于進程內的多線程共享,要看是否支持進程共享,請查看下你的系統的man手冊。
第三個參數value表示可用的資源的數目,即信號燈的數目,咱們這兒只有1個打印機所以設成1。
然后線程調用sem_wait取獲取這個信號燈,第一個線程一看,有1個,他就拿到了,然后可以繼續后繼操作,此時信號燈自動減1,變成0個。那么第二個線程調用sem_wait時就會阻塞在這兒了。
第一個線程完成打印后,調用sem_post釋放信號燈,信號燈數目變成1,將會喚醒等待的第二個線程,然后第二個線程接著打印。
最后當所有任務完成后,主線程調用sem_destroy釋放這個信號量。
?
OK?
另外幾個函數sem_trywait ,顧名思義,望文生義,就是測試一下看看現在有沒有可用的信號燈,而不會阻塞。
sem_getvalue嘛就是讀取當前的信號燈的數目。