程序通訊4 訊號量 Semaphore

2021-09-28 05:25:56 字數 2458 閱讀 8154

訊號量是什麼?

(1)訊號量本質上是乙個具有原子性的計數器,用來描述臨界資源的,不能用全域性變數count加加減減替換(因為他沒有原子性)。

(2)訊號量以保護臨界資源為目的,但他本身也是個臨界資源;他控制多個程序對共享資源的訪問,通常描述臨界資源當中,臨界資源的數量,常常被當做鎖來使用,防止乙個程序訪問另外乙個程序正在使用的資源

(3)其中最簡單的訊號量=1,也叫做二元訊號量(互斥鎖),可控制單個資源,只能取0和1;訊號量》=2為多元訊號量

只要理理解上面三句話,應該結合**理解就不難了。

#include

#include

key_t ftok

(const

char

* pathname,

int id)

//pathname:路徑名 id:專案id,非0整數(只有低8位有效)

函式

intsemget

(key_t key,

int nsems,

int sem***)

;//引數:key-->訊號集的名字

//nsems:訊號集中訊號量的個數

//sem***:由九個許可權構成,用法和建立檔案時使用的mode模式一樣

//返回值:成功返回乙個非負整數,即該訊號集的標識碼;失敗返回-1

建立成功後,linux下通過ipcs -s可以檢視已經建立的訊號量情況,刪除使用刪除:ipcrm -s semid

//semctl函式

intsemctl

(int semid,

int semnum,

int cmd,..

.);//引數:

//semid:mesget返回的訊號集標識碼

//semnum:訊號集中訊號量的序號

//cmd:將要採取的動作(有三個取值,一般用於銷毀)

//最後乙個引數根據命令不同而不同

//返回值:成功返回0;失敗返回-1

**實測;

我們用兩個程序分別對乙個檔案進行讀寫:

1.sem.h

#pragma once

#include

#include

#include

#include

#include

#include

#include

#include

union semun

;void

sem_init()

;//初始化

void

sem_p()

;//p操作 +1

void

sem_v()

;//v操作 -1

void

sem_destroy()

;//銷毀

2.sem.cpp

#include

"sem.h"

static

int semid =0;

void

sem_init()

}else}}

void

sem_p()

}void

sem_v()

}void

sem_destroy()

printf

("sem destory success!\n");

}

3.proa.cpp

#include

"sem.h"

#include

using

namespace std;

void

file_write

(int x)

;int

main()

sleep(2

);destory_sem()

;//由程序a來銷毀這個訊號量jin

return0;

}void

file_write

(int x)

4.prob.cpp

#include

"sem.h"

#include

using

namespace std;

void

file_write

(int x)

;int

main()

return0;

}void

file_write

(int x)

測試結果:

程序間通訊(4) 訊號量

之前我們學習了管道,訊息佇列,共享記憶體,今天我們再來學一種程序間通訊的方式 訊號量 訊號量 兩個程序看到的同乙個公共的資源,但是同時只能被乙個程序所使用的的資源叫做臨界資源 互斥資源 在晉城中涉及到互斥資源的程式段叫臨界區 互斥 各個程序都要訪問共享資源,但共享資源是互斥的,同時只能有乙個程序使用...

程序間通訊(訊號量通訊)

當我們在實際程式設計時會發現,有時候多個程序或執行緒共用一段 我們要確保某個時刻只有乙個程序或執行緒對這段 進行訪問。為了防止多個程式同時訪問乙個共享資源引發問題,可以用訊號量控制臨界區域的訪問。訊號量分為以下三種 system v訊號量,在核心中維護,可用於程序或執行緒間的同步,常用於程序的同步。...

Linux程序通訊 訊號量

主要用於程序對共享資源的互斥訪問。為了取得對乙個共享資源,程序測試訊號量的值,如果為正,表示還有資源可以訪問,該程序對訊號量加減一。如果為0表示沒有資源可以用,該程序應當休眠等待訊號量的值再次為正。linux中的訊號量使用起來是比較麻煩的。在這裡,訊號量是以集合形式存在的,建立時要給出訊號量的數目,...