
#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
} 最后的要求自己添加
设置状态变量lock=0,在占用资源的函数中,设置lock=1;并在处理结束后设lock=0.比如:
bool lock=0
int scan()
{
while(lock!=0) /谈型嫌/循环检测,直到资源释放才执行下面的语句
lock=1//锁定资源
...//具体的执行扫描的语句
lock=1//释放资源
return 0
}
这个方法容易实现,但是占用CPU,假定其他线程正在占用扫描仪,那么这个线程就会含手在自己的时间片内不停的执行while语句直到对方释放扫描仪。由此造成了浪费。
现在流行的做法是通过中断信号来做,那是一本书的内容,建议看linux内核编程方面的书。租携
利用银行家算法避免死锁 . 银行家算法 设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等待。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)