问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux入门 关于死锁

发布网友 发布时间:2022-09-25 00:20

我来回答

3个回答

热心网友 时间:2023-09-14 22:04

 

#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;
} 最后的要求自己添加

 

楼主自己一边编写一边学习咯,这样你一定理解得很深刻,祝你早日成为大牛,哈哈。

热心网友 时间:2023-09-14 22:05

死锁。。。其实你要自己实现也很容易。。。换句话说就是程序进入了死循环就行了,你写一段代码让他永不不会停止,这就是死锁了。

一般没人故意写死锁的,死锁一般都是多线程的时候容易造成,因为多个线程争抢同一个资源,如果没有用好互斥锁等手段,就很容易死锁了。追问呵呵,就是想求个简单易懂的代码示例=。=光看语言感觉挺模糊的,我是初学者,如果你能给个简单的代码我追加最高分,谢谢哈

热心网友 时间:2023-09-14 22:05

经典的AB锁,就是线程1持有A锁,想加锁B,线程2持有B锁,想加锁A。

热心网友 时间:2023-10-06 23:02

 

#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;
} 最后的要求自己添加

 

楼主自己一边编写一边学习咯,这样你一定理解得很深刻,祝你早日成为大牛,哈哈。

热心网友 时间:2023-10-06 23:02

死锁。。。其实你要自己实现也很容易。。。换句话说就是程序进入了死循环就行了,你写一段代码让他永不不会停止,这就是死锁了。

一般没人故意写死锁的,死锁一般都是多线程的时候容易造成,因为多个线程争抢同一个资源,如果没有用好互斥锁等手段,就很容易死锁了。追问呵呵,就是想求个简单易懂的代码示例=。=光看语言感觉挺模糊的,我是初学者,如果你能给个简单的代码我追加最高分,谢谢哈

热心网友 时间:2023-10-06 23:03

经典的AB锁,就是线程1持有A锁,想加锁B,线程2持有B锁,想加锁A。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
猫咪丢了之后心里很难过,然后男友担心我就重新去领养了一只小花猫,可是... 有关名侦探柯南黑暗组织!! qq上删除的好友怎么找回来,六个月以上的。只要能找到QQ号就行,我可以... 六个月内删掉的qq好友能找回吗? 急!!因欠费而停机的手机能收到短信吗 手机关机之后停机信息是否可以收到 手机欠费后冲了钱但还是欠费会收到短信吗 手机停机了,包月的流量没用完,能收到微信吗? 德州到潍坊用不用隔离? 南都周刊2011年有一篇社论≪躺在时间的河流上怀念他们≫写得很棒... android 死锁的概念,怎么避免死锁 怎么注销快手账号 如何注销快手账号 如何在手机上同时登录两个 复印机工程师资格证书有用么? 八大美院和艺术学院比较,谁的油画专业好 有哪些油画专业好点的美院 清脆的近义词和反义词 souxue5.com 我是重庆自考市场营销的本科生,明天要考00052管理系统中计算机应用的实践考试,请大家帮帮我。 苹果手机登录过的怎么查看? 苹果手机登录过的怎么查看? 如何挑选猪肉和牛肉 凉拌胡萝卜金针菇的家常做法大全怎么做好 qq被拉黑自己能看出来吗 没有洞洞的痘痘是怎么回事。大颗 有点白 脸上长了个不是痘痘没洞眼的东西是什么、看起来里面有白色东西似的,怎么治求助 soul每天看自己的人会显示吗 一套橱柜上用多少三合一怎么扣啊,有公式吗 想搬家床上是这样的件,是三合一扣件这种怎么拆? 请问一下电脑qq自启动怎么关闭 请问电脑qq自启动怎么关闭 怎样才能两个同时登录 为什么笔记本触摸板失灵了,笔记本触摸板失灵该怎么解决 怎样在电脑上申请 弱电布线,一根24芯光纤作为主线,中间有几个摄像头要分好几段的光,这个要怎么分? 村里装监控需要什么配件,怎么样布线 用电脑如何申请 在电脑上怎么注册? 嘉兴粽子的做法 嘉兴粽子的做法步骤 如何在手机上同时登录两个 怎样才能两个同时登录 临沂的聚乙烯渔网厂家在哪里有? 江苏常州哪里卖无结渔网网片哪有?卖渔网网片 我买了一副渔网,想到河边打渔,不会轮网,求撒渔网的技巧 龙口市红博渔网有限公司怎么样? 哪里能看到小说《我救了他,他抢了我老婆》的全文 三星手机的图库停止运行,怎么恢复? 电脑GBA模拟器玩火焰纹章如何凹点?求教 电脑都能玩什么版本的火焰纹章 GBA的游戏火焰纹章,我在PSP下无法运行,要怎么设置?谢谢。 三星880和天机800哪个好?