當前位置:首頁 » 編程語言 » c語言避免死鎖

c語言避免死鎖

發布時間: 2022-02-21 07:10:29

『壹』 死鎖解決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等待。

熱點內容
神奇攝影app無法存儲照片 發布:2025-01-05 11:37:42 瀏覽:898
電銷機器人系統源碼 發布:2025-01-05 11:37:41 瀏覽:721
招投標系統源碼 發布:2025-01-05 11:36:57 瀏覽:411
php翻轉字元串 發布:2025-01-05 11:30:20 瀏覽:334
公開密鑰加密系統 發布:2025-01-05 11:25:35 瀏覽:56
安裝mysqlpython 發布:2025-01-05 11:17:02 瀏覽:742
tar備份linux 發布:2025-01-05 11:13:37 瀏覽:727
大型pppoe伺服器搭建 發布:2025-01-05 11:12:59 瀏覽:843
怎麼修改360wifi密碼 發布:2025-01-05 11:12:51 瀏覽:61
php文件資料庫 發布:2025-01-05 11:06:18 瀏覽:768