我們在使用unix/linux系統中,往往會在使用訊號量時,出現比較茫然的狀態。我們倒地時使用system v系統的訊號量還是posix1建議實現的訊號量呢?因為posix1建議實現的訊號量,並非在所有unix/linux平台得到實現,所以即使使用,對於移植性來說,也未必可以得到肯定的答案。但是無論如何,個人認為我們還是最好使用posix1提供的訊號量,有部分的原因請參考
如何使用system v的訊號量中所述。下面的主要內容,我也將重點討論posix1所提供的訊號量。
對於posix1提供的訊號量,它提供了兩種形式。
一是命名的訊號量,它可以被多個程序所共享,並且時kernel persistent。也就是說,如果沒有使用sem_unlink函式,那麼它一直占用系統資源,直到系統reboot為止。它比system v系統提供的訊號量最大的優點是,對訊號量的建立和初始化操作是原子的,避免了在這裡的競爭關係。我們可以通過sem_open, sem_wait, sem_post,sem_unlink來建立、等待、刪除等操作。sem_unlink不是立刻把對應的訊號量刪除,而是在open計數達到0的時候才真正的從系統中將它刪除,否則一直滯留在系統中:)。sem_open對於多個相關或者無關的程序而言是安全的,我們可以這麼使用:
1)在相關程序中
sem_t *psem = sem_open( ... );
if ( fork() == 0 ) //子程序
父程序2)在多個不相關程序中
程序1sem_t *psem = open ( sem_name, o_creat | o_excl, .. );
程序2sem_t *psem = open( sem_name, ...)
程序1和2都能夠容易獲取相關訊號量,使用共享資源。
二是匿名信號量,也就是記憶體訊號量。它的獲取是通過 int sem_init(sem_t *sem, int pshared, unsigned int value);函式。pshared指明是否它可用於多程序,1可以,0不可以。它的優點顯而易見,很方便的建立和使用並且在所有相關程序消亡的時候自動消亡,但是缺點也非常的明顯。如果在被使用多程序環境中,它的副本是不能被使用的。請看下面:
sem_int( &sem, 1, 1 );
if ( fork() == 0 )//子程序
那麼怎麼使用了,很簡單,就是要將它放入到共享記憶體中去,這樣,子父程序都能夠正確的使用它了。
posix1標準也提供了互斥,那麼如何選定在程式中使用互斥還是訊號量呢?請參考
**訊號量(semaphore)和互斥(mutex)。簡單的說,如果在多程序中,最好使用命名訊號量,否則使用互斥。
如何理解並正確使用MySQL索引
1 概述 索引是儲存引擎用於快速查詢記錄的一種資料結構,通過合理的使用資料庫索引可以大大提高系統的訪問效能,接下來主要介紹在mysql資料庫中索引型別,以及如何建立出更加合理且高效的索引技巧。注 這裡主要針對的是innodb儲存引擎的b tree索引資料結構 2 索引的優點 1 大大減輕了伺服器需要...
Go如何正確的使用mysql driver
具體文章檢視 總結 對於大多數使用setmaxopenconns 來限制開啟連線的最大數量的程式,都會對效能產生負面影響,但如果資料庫資源比較緊張的情況下,這麼做還是有好處的。如果程式突發或定期同時執行兩個以上的資料庫任務,那麼通過setmaxidleconns 增加空閒連線池的大小可能會產生積極的...
的正確使用 如何正確使用安全帶 安全帶正確繫法
成年人正確佩戴安全帶法 1 關好並鎖住車門 2 調整座椅,使身體能夠坐直 3 抓住安全帶頭部的鎖舌,沿著身體往下拉安全帶。注意安全帶不能扭結。如果拉得太快,安全帶可能會鎖死,此時,只要往回稍微收一點安全帶,就可以解鎖,然後再慢慢地往下拉安全帶 4 將鎖舌扣到搭扣中,直到聽到 喀噠 一聲響。往上拽一拽...