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