永发信息网

关于VC线程同步的问题

答案:1  悬赏:80  手机版
解决时间 2021-07-28 17:32

这是一个 临界区的火车票系统 可以通过编译 但是不能运行 哪位大虾帮帮忙。谢过

#include<windows.h>
#include<iostream.h>

DWORD WINAPI fang1proc(
LPVOID lpParameter // thread data
);
DWORD WINAPI fang2proc(
LPVOID lpParameter // thread data
);

int ticket=100;
LPCRITICAL_SECTION mg_cr;

void main()
{
HANDLE yifan1;
HANDLE yifan2;
yifan1=CreateThread(NULL,0,fang1proc,NULL,0,NULL);
yifan2=CreateThread(NULL,0,fang2proc,NULL,0,NULL);
CloseHandle(yifan1);
CloseHandle(yifan2);

InitializeCriticalSection(mg_cr);

Sleep(4000);

DeleteCriticalSection(mg_cr);

}


DWORD WINAPI fang1proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
EnterCriticalSection(mg_cr);

if(ticket>0) //关键代码段
{
Sleep(1);
cout<<"thread1 sell ticket:"<<ticket--<<endl;
}
else
{
break;
}

LeaveCriticalSection(mg_cr);

}
return 0;
}


DWORD WINAPI fang2proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
EnterCriticalSection(mg_cr);

if(ticket>0) //关键代码段
{
Sleep(1);
cout<<"thread2 sell ticket:"<<ticket--<<endl;
}
else
{
break;
}

LeaveCriticalSection(mg_cr);

}
cout<<"thread2 is runing"<<endl;
return 0;
}

最佳答案

你的LPCRITICAL_SECTION mg_cr;定义了一个指针;


并没有对这个指针赋值;所以是一个也指针。


所以后面的InitializeCriticalSection(mg_cr);


DeleteCriticalSection(mg_cr);


EnterCriticalSection(mg_cr);


LeaveCriticalSection(mg_cr);


执行过程中并没有找到实际对象,所以


在main()中,InitializeCriticalSection(mg_cr);就出错了(有时候能执行过去,按理是执行不过去的)。


所以并没有进入卖票系统的子线程。


改为以下代码:


CRITICAL_SECTION mg_cs;


LPCRITICAL_SECTION mg_cr = mg_cs;



好好参透一下,感觉你这段代码写得太不合理了。


而且我执行了,只有一个线程指行,原因如下:


while(TRUE)
{
EnterCriticalSection(mg_cr);


if(ticket>0) //关键代码段
{
Sleep(1);
cout<<"thread2 sell ticket:"<<ticket--<<endl;
}
else
{
break;
}


LeaveCriticalSection(mg_cr);



由于你的代码循环里面没有LeaveCriticalSection(mg_cr);因此资源得不到释放,所以只有将循环一直执行。


另一个线程得不到资源,因此一个线程卖了所有的票,退出循环才释放资源,退出此线程,这是虽然另一个线程得到资源,可是ticket已经为0了,自然无票可卖了。



呵呵,你好好看看源代码,仔细斟酌就能斟酌出其中的含义了。



还有说具题外的,程序只是外表,核心的数学算法才是本质的东西,脱离程序存在的灵魂。


有时间可以学学数学,我们也可以交流。



加油!

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
老师没收学生手机,并且翻看手机短信以及其他
南县益阳南县群祥武术馆地址有谁知道?有点事
我下了个游戏5.8G,但是我的电脑提示,超过4G
有位朋友生日啦!在他的邀请下,我将参加他的生
福州哪里有若基亚专卖店?
最近,穷啊..咋整....
休闲惬意的生活的诗词,描写生活安逸的诗句
拜帮我想一想:我有个朋的女儿姓莫的,名字中
淅川县南阳澳柯玛太阳能这个地址在什么地方,
是否有办法处理鞋面氧化?
爱情是否会像童话里的那样真诚
为什么在QQ上打不开空间了?
春风物语电影 下载
怎样使用手机冲QB,请内行详细说下.
开机就弹出utilty.exe 无法找到入口是怎么回
推荐资讯
“你就像个刽子手把我出卖”这首歌叫什么名字
风吹树叶沙沙响诗句,风一吹树叶哗啦哗啦地响
QQ农场的Q群有吗?
椒江有沒哈根達斯店?
东方蝾螈吃双汇火腿肠么?
淮阳县周口鑫达彩钢(龙都大道北段)地址在哪里
谁知道连云港教育局的电话啊?
荷载的分类?
WORD的边款怎么做啊,还有背景
牛仔裤品牌最著名的是什么呢,里维斯的不错吗
独立声卡内放怎么调试啊 急急急
pro/e4.0画图时如何建立局部坐标系
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?