計數訊號量原理:
計數訊號量**如下:
#include
//生產者和消費者模型
//倉庫貨架空位 10 定為0號訊號量
//產品數目 0 定為 1 號訊號量
intmain
(int argc,
char
* ar**)
;//第乙個為倉庫貨架空位個數,第二個為產品個數
int ret=
semctl
(sems_id,
0,setall,arr)
;error_check
(ret,-1
,"semctl");
//令父程序為生產者,子程序為消費者。
struct sembuf sopp,sopv;if(
!fork()
)}else
}return0;
}
執行效果如下:
//生產者和消費者模型
//倉庫貨架空位 10 定為0號訊號量
//產品數目 0 定為 1 號訊號量
?int
main
(int argc,
char
* ar**)
;//第乙個為倉庫貨架空位個數,第二個為產品個數
int ret=
semctl
(sems_id,
0,setall,arr)
;error_check
(ret,-1
,"semctl");
//令父程序為生產者,子程序為消費者。
struct sembuf sopp,sopv;if(
fork()
)}else
}return0;
}執行效果如下:
可發現,在sem_undo 的執行下,將子程序(生產者)終止後,會使之前生產的產品重置,即讓**回到原來還未執行時的狀態。
如果將sem_undo 的效果去除,則會得到如下的執行效果:
顯然,倉庫產品數和貨架空位超過了最大值10,發生了錯誤。
沒有使用 sem_undo 死鎖的**如下:
#include
#define n 10000000
//例:訊號量崩潰,產生死鎖
intmain
(int argc,
char
* ar**)
else
else
printf
("result=%d\n"
,p[0])
;}return0;
}
執行效果如下:
可見子程序崩潰,產生了殭屍程序(z),程式死鎖,導致無法往下執行。
linux學習筆記17
vim vim介紹 vim是vi的公升級版,vim和vi的最大區別就是編輯乙個文字時vi不會顯示顏色,vim會顯示顏色,vim的安裝方法yum install y vim enhanced。vim顏色顯示 vim的顏色和你檔案的具體內容有關,相同的檔案在不同的目錄下都有可能導致顏色不存在,vim的配...
APUE學習筆記 17 執行緒和訊號
by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 12章。2.總結了如何設定執行緒的訊號遮蔽字,以及如何使用專用線程進行訊號處理。3.執行緒的訊號遮蔽字 每個執行緒都有自己的執行緒遮蔽字,但是訊號處理函式是程序中所有執行緒...
APUE學習筆記 17 執行緒和訊號
by 潘雲登 date 2009 8 22 email intrepyd gmail.com homepage 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix環境高階程式設計 第2版 第12章。2.總結了如何設定執行緒的訊號遮蔽字,以及如何使用專用線程進行訊號處理。...