天天看點

14、posix信号量簡介

sem_open(3)

initialize and open a named semaphore

sem_init(3)

initialize an unnamed semaphore

sem_wait(3)

P 操作

sem_post(3)

V 操作

sem_close(3)

close a named semaphore

sem_destroy(3)

destory an unnamed semaphore

sem_unlink(3)

remove a named semaphore

    無名信号量可以用在共享記憶體的情況下,比如實作程序中各個線程之間的互斥和同步。命名信号量通常用于不共享記憶體的情況下,比如不共享記憶體的程序之間。

1、有名信号量的建立

1)建立并初始化

sem_t *sem_open(const char *name, int oflag); //打開已存在

sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); //建立

name用于辨別信号量的名字

oflag被設定為O_CREAT用來建立一個信号量(如果和0_EXCL一起,當這個信号量已經存在時候這個調用将會失敗)

mode控制新的信号量的通路權限

value指定信号量的初始化值

2)int sem_wait(sem_t *sem);

    鎖住信号量,如果這個信号量的計數大于0,鎖住這個信号量之後,信号量計數減一。如果這個信号量的計數是0,這個調用被阻塞。

解鎖一個信号量的語義是:

3)int sem_post(sem_t *sem);

對信号量增1然後傳回。

4)銷毀信号量

    在退出或是退出處理函數中調用sem_unlink()去删除系統中的信号量。在sem_unlink之前,要確定所有對這個有名信号量的引用都已經通過sem_close()關閉,否則,sem_unlink()函數不會起到任何的作用。

5)有名信号燈支援程序間通信。

2、無名信号量的建立

    一個無名信号量被放置在一個被多個線程(多線程共享信号量)或是程序(多程序共享信号量)共享的記憶體區域。一個線程共享信号量被放置在一個隻有同一個程序的線程共享它們的區域,例如一個全局的變量。一個程序共享的信号量被放置在一個不同程序可以共享它們的區域,例如一個共享記憶體區。一個無名信号量為線程間和相關的程序間提供同步機制。

1)無名信号量不需要使用sem_open調用,下面的兩行代碼替換了它的行為:

{

  sem_t semid;

  int sem_init(sem_t *sem, int pshared, unsigned  value);

}

示例代碼見[2]。

3、信号量是包含一個非負整型變量

<a href="http://files.cnblogs.com/mydomain/posix%E4%BF%A1%E5%8F%B7%E9%87%8F%E7%AE%80%E4%BB%8B.pdf">文檔說明</a>

參考

<a href="http://www.cnblogs.com/mydomain/archive/2011/08/14/2138456.html">http://www.cnblogs.com/mydomain/archive/2011/08/14/2138456.html</a>

繼續閱讀