學(xué)習(xí)簡單的Unix信號量
Unix信號量(SEMAPHORE)則是防止兩個或多個進程同時訪問共享資源的一種機制。在Unix信號量機制實現(xiàn)之前,通常采用加鎖文件的方法。信號量(Semaphore),有時被稱為信號燈,是在多線程環(huán)境下使用的一種設(shè)施,是可以用來保證兩個或多個關(guān)鍵代碼段不被并發(fā)調(diào)用。在進入一個關(guān)鍵代碼段之前,線程必須獲取一個信號量;一旦該關(guān)鍵代碼段完成了,那么該線程必須釋放信號量。
其它想進入該關(guān)鍵代碼段的線程必須等待直到第一個線程釋放信號量。為了完成這個過程,需要創(chuàng)建一個信號量VI,然后將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關(guān)鍵代碼段的首末端。確認這些信號量VI引用的是初始創(chuàng)建的信號量。UNIXSYSTEMV以一個長整數(shù)的鍵值作為Unix信號量集合的唯一標識,Unix信號量通常由下列元素組成:
①信號量的值
②操作該信號量的最后一個進程的進程標識
③等待增加該信號量的值的進程數(shù)
④等待該信號量的值為0的進程數(shù)
與之有關(guān)的系統(tǒng)調(diào)用如下:
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- int semget(key,count,flags)
- /*獲取信號量集合的標識符*/
- key_tkey; /*信號量集合的鍵*/
- intcount; /*信號量集合中元素個數(shù)*/
- intflags; /*任選參數(shù)*/
- /*返回信號量集合標識符,若出錯則返回-1*/
- int semop(sid,ops,nops) /*信號量操作*/
- int sid; /*信號量集合標識符*/
- struct sembuf *ops; /*信號量操作結(jié)構(gòu)的指針*/
- intnops; /*信號量操作結(jié)構(gòu)的個數(shù)*/
- /*返回運算完成前該組信號量中最后一個被運算的信號量的
- 值,若出錯則返回-1*/
- int semctl(sid,semnum,cmd,arg)
- /*控制信號量操作*/
- intsid; /*信號量集合標識符*/
- intsemnum; /*信號量元素編號*/
- intcmd; /*控制命令*/
- union semun{
- intval;
- struct semid_ds *buf;
- ushort*array;} arg; /*命令參數(shù)*/
Unix信號量元素組成部分我們就講解到這里了。
【編輯推薦】