c語言避免死鎖
『壹』 死鎖解決c語言程序
#include <windows.h>
#include <iostream>
#include<time.h>
const unsigned short SIZE_OF_BUFFER = 1; //緩沖區長度
int g_buffer[SIZE_OF_BUFFER];
bool g_continue = true; //控製程序結束
HANDLE g_hMutex; //用於線程間的互斥
DWORD WINAPI FatherProc(LPVOID); //父進程線程
DWORD WINAPI SonProc(LPVOID); //使用列印機的線程
int main()
{
//創建各個互斥信號
g_hMutex = CreateMutex(NULL,FALSE,NULL);
const unsigned short FATHERS_COUNTS = 1; //父進程線程的個數
const unsigned short SONS_COUNT = 2; //使用列印機的線程的個數
//總的線程數
const unsigned short THREADS_COUNT = FATHERS_COUNTS+SONS_COUNT;
HANDLE hThreads[THREADS_COUNT]; //各線程的handle
DWORD fatherID[FATHERS_COUNTS]; //父進程線程的標識符
DWORD sonID[SONS_COUNT]; //使用列印機的線程的標識符
//父進程線程
for (int i=0;i<FATHERS_COUNTS;++i){
hThreads[i]=CreateThread(NULL,0,FatherProc,NULL,0,&fatherID[i]);
if (hThreads[i]==NULL) return -1;
}
//使用列印機的線程
for (i=0;i<SONS_COUNT;++i){
hThreads[SONS_COUNT+i]=CreateThread(NULL,0,SonProc,NULL,0,&sonID[i]);
if (hThreads[i]==NULL) return -1;
}
while(g_continue){
if(getchar())
{ //按回車後終止程序運行
g_continue = false;
}
}
return 0;
}
//分配列印機
void Append()
{
srand((unsigned)time(0));
std::cerr << "列印機空閑 ...\n";
if(rand()%2)
{
g_buffer[0]=1;//給PA
}
else
{
g_buffer[0]=0;//給PB
}
}
//son使用列印機
void Take()
{
if(g_buffer[0]==1)
{
std::cerr << "PA使用列印機 ... ";
std::cerr << "成功" << std::endl<<std::endl; ;
};
if(g_buffer[0]==0)
{
std::cerr << "PB使用列印機 ... ";
std::cerr << "成功" << std::endl<<std::endl; ;
};
g_buffer[0]=-1;
}
//父進程
DWORD WINAPI FatherProc(LPVOID lpPara)
{
while(g_continue){
WaitForSingleObject(g_hMutex,INFINITE);
Append();
Sleep(1500);
ReleaseMutex(g_hMutex);
}
return 0;
}
//子進程
DWORD WINAPI SonProc(LPVOID lpPara)
{
while(g_continue){
WaitForSingleObject(g_hMutex,INFINITE);
Take();
Sleep(1500);
ReleaseMutex(g_hMutex);
}
return 0;
} 最後的要求自己添加
『貳』 c語言死鎖解除程序,利用尋找上一級標識,不讓上級發射變遷到死鎖標識,最後輸出,如果存在死鎖,讓父標
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t m;
void *runodd(void *d)
{
int i=0;
for(i=1;;i+=2)
{
pthread_mutex_lock(&m);
printf("奇數:%d\n",i);
usleep(100);
pthread_mutex_unlock(&m);
}
}
void *runeven(void *d)
{
int i=0;
for(i=0;;i+=2)
{
pthread_mutex_lock(&m);
printf("偶數:%d\n",i);
usleep(100);
pthread_mutex_unlock(&m);
}
}
main()
{
pthread_t todd,teven;
pthread_mutex_init(&m,0);
pthread_create(&todd,0,runodd,0);
pthread_create(&teven,0,runeven,0);
sleep(5);
printf("外部強制停止todd線程\n");
pthread_cancel(todd);
pthread_join(todd,(void**)0);
pthread_join(teven,(void**)0);
pthread_mutex_destroy(&m);
}
『叄』 求一個在C語言環境下進行死鎖檢測的程序
#include<stdio.h>
#include<iostream.h>
#include<string.h>
const int MAXQUEUE=100; //定義表的最大行數
typedef struct node{
int resource;
int process;
}cell;
cell occupy[MAXQUEUE];
int occupy_quantity;
cell wait[MAXQUEUE];
int wait_quantity;
//初始化函數
void initial()
{
int i;
for(i=0;i<MAXQUEUE;i++){
occupy.process=-1;
occupy.resource=-1;
wait.process=-1;
wait.resource=-1;
}
occupy_quantity=0;
wait_quantity=0;
}
//讀數據文件
int readData()
{
FILE *fp;
char fname[20];
int i;
cout<<"請輸入資源分配表文件的文件名:"<<endl;
strcpy(fname,"10trouble1.txt");
//cin>>fname;
if((fp=fopen(fname,"r"))==NULL){
cout<<"錯誤,文件打不開,請檢查文件名:)"<<endl;
return 0;
}
else{
while(!feof(fp)){
fscanf(fp,"%d %d",&occupy[occupy_quantity].resource,&occupy[occupy_quantity].process);
occupy_quantity++;
}
}
cout<<"請輸入進程等待表文件的文件名:"<<endl;
strcpy(fname,"10trouble2.txt");
//cin>>fname;
if((fp=fopen(fname,"r"))==NULL){
cout<<"錯誤,文件打不開,請檢查文件名:)"<<endl;
return 0;
}
else{
while(!feof(fp)){
fscanf(fp,"%d %d",&wait[wait_quantity].process,&wait[wait_quantity].resource);
wait_quantity++;
}
}
//輸出所讀入的數據
cout<<endl<<endl<<"輸出所讀入的數據"<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"資源分配表"<<endl;
cout<<"資源編號 進程編號"<<endl;
for(i=0;i<occupy_quantity;i++){
cout<<" "<<occupy.resource<<" "<<occupy.process<<endl;
}
cout<<"———————————————————————"<<endl;
cout<<"進程等待表"<<endl;
cout<<"進程編號 資源編號"<<endl;
for(i=0;i<wait_quantity;i++){
cout<<" "<<wait.resource<<" "<<wait.process<<endl;
}
return 1;
}
//檢測
void check()
{
int table[MAXQUEUE][MAXQUEUE];
int table1[MAXQUEUE][MAXQUEUE];
int i,j,k;
int flag,t,p;
int max_process;
//初始化表格
for(i=0;i<MAXQUEUE;i++){
for(j=0;j<MAXQUEUE;j++){
table[j]=0;
table1[j]=0;
}
}
//先找到進程最大編號
max_process=-1;
for(i=0;i<occupy_quantity;i++){
if(occupy.process>max_process){
max_process=occupy.process;
}
}
for(i=0;i<wait_quantity;i++){
if(wait.process>max_process){
max_process=wait.process;
}
}
for(i=0;i<wait_quantity;i++){
for(j=0;j<occupy_quantity;j++){
if(wait.resource==occupy[j].resource){
table[wait.process][occupy[j].process]=1;
table1[wait.process][occupy[j].process]=1;
}
}
}
cout<<"初始等待佔用表:"<<endl;
for(i=0;i<max_process+1;i++){
for(j=0;j<max_process+1;j++){
cout<<table[j]<<" ";
}
cout<<endl;
}
cout<<endl;
for(i=0;i<max_process+1;i++){
for(j=0;j<max_process+1;j++){
for(k=0;k<max_process+1;k++){
table[j]=table[j]||(table[k]&&table[k][j]);
}
}
}
cout<<"檢測後的等待佔用表:"<<endl;
for(i=0;i<max_process+1;i++){
for(j=0;j<max_process+1;j++){
cout<<table[j]<<" ";
}
cout<<endl;
}
flag=-1;
for(i=0;i<max_process+1;i++){
if(table==1){
flag=i;
break;
}
}
cout<<endl<<endl<<"檢測結果"<<endl;
cout<<"———————————————————"<<endl;
if(flag!=-1){
cout<<"存在死鎖"<<endl;
cout<<"進程循環等待隊列:";
p=flag; //存在進程循環等待隊列的那一進程
//進程循環等待隊列中的所有進程是table表中的這一行是1的進程,只是順序要再確定
t=1;
while(t){
cout<<p<<" ";
for(j=0;j<max_process+1;j++){
if(table1[p][j]==1){
if(table[j][flag]==1){
p=j;
break;
}
}
}
if(p==flag)t=0;
}
cout<<flag<<endl;
}
else{
cout<<"不存在死鎖"<<endl;
}
}
『肆』 用C語言定義一個死鎖
樓主是垃圾啊~~
---------------------------------------------
while(1);
for(;;);
死循環算不算死鎖?
『伍』 c語言高手進:什麼是"鎖死"
一個進程佔用了系統的一個資源,但是它同時需要量外一個資源,但是另外一個進程同時佔用了了原來的進程需要的資源,而且也在等在系統分配原來的進程佔用的資源。這就是死鎖
『陸』 (C語言中)互斥鎖的死鎖問題
如果你將mutex_c換成mutex_p,則不會死鎖,因為,你第一個線程鎖上後,切換到第二個線程,因為mutex_p未釋放,第二個線程無法獲取mutex_p,進入等待狀態,此時OS將再次調度第一個線程,直到第一個線程釋放mutex_p之後,第二個線程才會被激活,然後調試第二線程,獲取mutex_p.
使用OS提供的互斥量來保護公共資源還是比較安全的,但如果用二值信號量的話,就可能會有優先順序反轉的情況.
『柒』 C語言實現死鎖
如果是java就好了,無能為力呀!
『捌』 C語言如何避免死循環
管理好你的循環控制變數
使while 的條件有機會為FALSE
或在循環體中加入break,並使它有機會執行。
『玖』 C語言中避免程序一閃而過的代碼intmain(void){…system("pause");見下
一閃而過是程序自動結束,同時編譯器沒有提供結果駐留功能。對於此種情況,可以手動在代碼結尾增加駐留功能的函數。常用的有如下兩種:
1 通過getch函數駐留。
getch會等待從屏幕的輸入,在main函數退出前,增加
getch();
調用,系統會等待輸入,直到有新的輸入,才會退出界面。
2 通過system("pause");來實現駐留。
在main退出前調用
system("pause");
會調用系統的pause函數,提示並實現按任意鍵退出程序效果。
如果是已經編譯好的C語言程序,可以通過開始->運行,鍵入cmd後回車。
在打開的命令行窗口,將可執行文件拖動到窗口上,再回車即可運行該程序,在此窗口不會出現閃退,從而觀察運行結果。
由於該問題僅在windows平台出現,所以以上介紹均針對windows平台。
『拾』 怎樣用C語言描述操作系統里的死鎖演算法謝謝。
利用銀行家演算法避免死鎖 . 銀行家演算法 設Requesti是進程Pi的請求向量,如果Requesti〔j〕=K,表示進程Pi需要K個Rj類型的資源。當Pi發出資源請求後,系統按下述步驟進行檢查:� (1) 如果Requesti〔j〕≤Need〔i,j〕,便轉向步驟2;否則認為出錯,因為它所需要的資源數已超過它所宣布的最大值。 (2) 如果Requesti〔j〕≤Available〔j〕,便轉向步驟(3);否則, 表示尚無足夠資源,Pi須等待。 (3) 系統試探著把資源分配給進程Pi,並修改下面數據結構中的數值:� Available〔j〕∶=Available〔j〕-Requesti〔j〕;� Allocation〔i,j〕∶=Allocation〔i,j〕+Requesti〔j〕;� Need〔i,j〕∶=Need〔i,j〕-Requesti〔j〕;� (4) 系統執行安全性演算法,檢查此次資源分配後,系統是否處於安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則, 將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。 (3) 系統試探著把資源分配給進程Pi,並修改下面數據結構中的數值:� Available〔j〕∶=Available〔j〕-Requesti〔j〕;� Allocation〔i,j〕∶=Allocation〔i,j〕+Requesti〔j〕;� Need〔i,j〕∶=Need〔i,j〕-Requesti〔j〕;� (4) 系統執行安全性演算法,檢查此次資源分配後,系統是否處於安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則, 將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。 (3) 系統試探著把資源分配給進程Pi,並修改下面數據結構中的數值:� Available〔j〕∶=Available〔j〕-Requesti〔j〕;� Allocation〔i,j〕∶=Allocation〔i,j〕+Requesti〔j〕;� Need〔i,j〕∶=Need〔i,j〕-Requesti〔j〕;� (4) 系統執行安全性演算法,檢查此次資源分配後,系統是否處於安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則, 將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。