永发信息网

关于VC线程同步的问题

答案:1  悬赏:80  手机版
解决时间 2021-07-28 17:32
  • 提问者网友:听门外雪花风
  • 2021-07-28 12:29

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

#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;
}

最佳答案
  • 五星知识达人网友:末日狂欢
  • 2021-07-28 13:27

你的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了,自然无票可卖了。



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



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


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



加油!

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯