死锁解决C语言程序

死锁解决C语言程序,第1张

#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=0i<FATHERS_COUNTS++i){

hThreads[i]=CreateThread(NULL,0,FatherProc,NULL,0,&fatherID[i])

if (hThreads[i]==NULL) return -1

}

//使用打印机的线程

for (i=0i<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

} 最后的要求自己添加

有两种办法:

重载一个queue模板,把锁封装到重载的函数里

每次使用queue的函数的时亩誉候加迅粗段锁,使凳蔽用完毕后,解锁

// playFair 加密 你参考下 ...

#include"stdio.h"

#include"string.h"

#include"stdlib.h"

#define x 50

char MiYao[x],PassWord[x],AddPass[x],Table[5][5],Map[25]

bool Visit[27]={false}

char English[27]="abcdefghijklmnopqrstuvwxyz"

void Input()

{

printf("请输入密蚂返钥:\t") scanf("%s",MiYao)

printf("请输入待加密密码:\t") scanf("%s"闷烂饥,PassWord)

}

void Fun_5x5()

{

int count = 0,V =0

/*标记密钥内字符为: true*/

for(int i=0MiYao[i]!='\0'i++)

if(strchr(English,MiYao[i])!=NULL)

Visit[strchr(English,MiYao[i])-English] = true

/*执行密钥矩阵 *** 作 并标记已使用字符:true*/

for(int i=0i<5i++)

for(int j=0j<5j++)

{

if(count<strlen(MiYao))

Table[i][j] = MiYao[count++]

else

{

while(Visit[V] != false) V++

Table[i][j] = English[V]

Visit[V++] = true

}

}

puts("∞∞∞密钥矩阵为∞∞∞")

for(int i=0i<5i++)

{ for(int j=0j<5j++)

printf("%3c",Table[i][j])

puts("")

}

puts("∞∞∞∞∞∞∞∞∞∞∞")

}

int IsVisited(char ch)

{

return Visit[strchr(English,ch)-English] //false 未出现过

}

void TabletoMap()

{ int count=0

for(int i=0i<5i++)

for(int j=0j<5j++)

Map[count++]=Table[i][j]

Map[count]='\0'

}

void Judge()

{

int len = strlen(PassWord),i,j,k

memset(AddPass,0,sizeof(char))

/*一历或对对去字母,剩下单个字母,则不变化,直接放入加密串中.*/

if(len%2){

AddPass[len-1] = PassWord[len-1]

len -=1

}

/*一对中 密钥矩阵中 存在矩阵 eg.ab 先输出a同行顶点在输出b同行顶点*/

int row1,low1,row2,low2,a1,a2

for(i=0i<leni+=2)

{

char c1,c2

c1 = PassWord[i]

c2 = PassWord[i+1]

/*一对中 两字母相同 无变化*/

/*一对中 有字母不在密钥矩阵中 无变化*/

if(c1 == c2 || ( !IsVisited(c1)||!IsVisited(c2)))

{ AddPass[i] = c1

AddPass[i+1]=c2

}else{

a1 = strchr(Map,c1)-Map

row1 = a1/5 low1 = a1%5

a2 = strchr(Map,c2)-Map

row2 = a2/5 low2 = a2%5

/*一对中 字符出现在同行或同列 简单swap字符*/

if(row1 == row2 || low1 == low2)

{

AddPass[i] = c2

AddPass[i+1] = c1

}else{

AddPass[i] = Table[row1][low2]

AddPass[i+1] = Table[row2][low1]

}

}

}AddPass[len+1]='\0'

puts("加密后字符串:")

puts(AddPass)

puts("原串是:")

puts(PassWord)

}

int main()

{

Input()

Fun_5x5()

TabletoMap()

Judge()

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12505801.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存