python司机和售票员的故事

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hanyuyang19940104/article/details/79431925
1. 创建父子进程分别表示司机和售票员
2. 当售票员扑捉 SIGINT 信号时 ,发送SIGUSR1给司机,司机打印(‘发车了’)
   
当售票员捕捉到 SIGQUIT 信号时,发送SIGUSR2给司机,司机打印('停车')
   
司机捕捉到 SIGTSTP, 发送 SIGUSR1给售票员,
售票员打印(‘到站了 请下车’)
3.到站后司机等待售票员先下车,然后自己exit


温馨提示 : 当通过键盘发送信号时,会发送给终端的所有进程


展开阅读全文

MFC实现模拟线程同步(司机售票员)(附有源码)

11-24

各位大哥,小弟我最近要做一个模拟线程同步的程序,要求有图形界面,我设计了一下,大体试了一下,但是遇到很多问题,请各位百忙之中看一下,帮我出出主意,不胜感激!(基于单文档应用程序)rn 一:总体的设想rn 首先,对于公交车的线路,模拟的话,我是画了一个矩形;rn 其次,对于站点的模拟,我画了几个实心的圆来代替;rn 最后,公交车,我用一幅公交车位图来模拟;rn 二:代码rn 1:首先是公交线路和站点的模拟部分:rn 在OnDraw函数中我这样做:rn CPen mypen, * oldpen;rn mypen.CreatePen(PS_SOLID,10,RGB(0,0,200));rn oldpen=(CPen *)pDC->SelectObject(&mypen);rn pDC->RoundRect(CRect(100,100,800,500),CPoint(50,50));rn pDC->SelectObject(oldpen);rn CBrush brush(RGB(153,0,251));rn CBrush *oldbrush=pDC->SelectObject(&brush);rn pDC->Ellipse(CRect(435,85,465,115));rn pDC->Ellipse(CRect(85,285,115,315));rn pDC->Ellipse(CRect(435,485,465,515));rn pDC->Ellipse(CRect(785,285,815,315));rn pDC->SetTextColor(RGB(255,50,0));rn pDC->TextOut(400,470,CString("电子科大长安校区"));rn pDC->TextOut(130,270,CString("郭杜站"));rn pDC->TextOut(420,130,CString("电子商城"));rn pDC->TextOut(750,270,CString("电子科大老校区"));rn 2:其次:我对于公交车的模拟:rn 我加载了一幅位图:rn 在OnInitialUpdate()函数中,我这样做:rn CView::OnInitialUpdate();rn m_static.Create(NULL, WS_CHILD|WS_VISIBLE|SS_BITMAP, CRect(m_carpoint.x, m_carpoint.y, 32, 32), this); rn m_static.SetBitmap(LoadBitmap(AfxGetInstanceHandle(), (LPCTSTR)IDB_BITMAP1));rn GetParentFrame()->RecalcLayout();rn SetTimer(2,1,NULL);rn 3:线程控制部分:rn 利用互斥量来实现,建立两个进程分别是公交车司机进程和售票员进程rn 位图初始化的时候,是m_carpoint.x=450;m_carpoint.y=500;其中m_carpoint是车子的位置,在Ontimer中是这样写的:rn if(m_carpoint.x>100&&m_carpoint.y==500&&car_on)rn rn m_carpoint.x-=1;rn m_static.MoveWindow(m_carpoint.x,500,30,30,true);rn rn else if(m_carpoint.x==100&&m_carpoint.y>100&&car_on)rn rn m_carpoint.y-=1;rn m_static.MoveWindow(100,m_carpoint.y,30,30,true);rn rn else if(m_carpoint.x<800&&m_carpoint.y==100&&car_on)rn rn m_carpoint.x+=1;rn m_static.MoveWindow(m_carpoint.x,100,30,30,true);rn rn else if(m_carpoint.x==800&&m_carpoint.y<500&&car_on)rn rn m_carpoint.y+=1;rn m_static.MoveWindow(800,m_carpoint.y,30,30,true);rn rn if(m_carpoint.x==450&&m_carpoint.y==100||rn m_carpoint.x==100&&m_carpoint.y==300||rn m_carpoint.x==800&&m_carpoint.y==300||rn m_carpoint.x==450&&m_carpoint.y==500)rn rn car_on=false;rn rn elsern car_on=true;rn 我所理解的线程就是:司机在开车之前去判断售票员是否关门了,售票员开门之前看司机是否停车了,XP操作系统给每个线程分配 时间片,用完的话换到宪哥进程,一次实现程序的并发,在我这个例子中,车子是不是停车应该是在Timer中判断,是不是车子到达了指定的站点,司机线程停车,Sleep两秒中,互斥量交给售票员,售票员开门,释放互斥量,交给司机,司机得到door_on是false即车子关了,开车,等等rn DWORD WINAPI CZuoyeView::busdriver(LPVOID lpParameter)rnrn while(true)rn rn if(!door_on)rn rn car_on=true;rn WaitForSingleObject(hMutex,INFINITE);rn Sleep(2000);rn rn rn elsern rn //car_on=false;rn ReleaseMutex(hMutex);rn rn rn rn return 0;rnrnDWORD WINAPI CZuoyeView::conduct(LPVOID lpParameter)rnrn while(true)rn rn if(!car_on)rn rn door_on=true;rn WaitForSingleObject(hMutex,INFINITE);rn Sleep(2000);rn rn elsern rn door_on=false;rn ReleaseMutex(hMutex);rn rn rn return 0;rnrn以上是我的线程函数,但是问题来了:首先,在司机线程判断的时候,也许时间片在售票员那里,该售票员判断的时候,也许时间片在司机那里,如果线程里面去判断是不是停车,那就更糟了,因为,是不是停车由一个点决定,是转瞬即逝的,时间片显得很长,会错过好多站点rn,这个程序目前是异常状态,希望大家看一看,我也许对线程同步的概念理解的不是很到位,希望大家指导!也许这个程序设计的时候有什么问题?怎么解决车子停车对与m_carpoint的判断?希望你的回帖和意见,不胜感激,我发帖从来都是回帖有分,希望大家给点主意,分不够我再加!! rn rn 论坛

我亲眼所见的上海售票员

02-08

票是从个别售票员手上出来的,下面是我亲眼所见rn------------------------------------------------------------------------------------------------rn我上星期六( 2007年02月03日 )早晨前去上海火车站南广场的联合售票大厅购买本周六( 2007年02月10日 )的 5064次(上海 – 镇江)的火车票rnrn等我快排到窗口时(我前面还有两位购票者,估计6时左右),上来了一个跟售票员(戴眼睛,大概40多岁)认识的说上海话的女子,从携带的包里拿出了大把的现金欲购票,此时第一为购票者已经买到了想要的票,随后那个说上海话的女子拿了张纸递给了售票员,售票员拿到纸后就把纸展开并放到抽屉里,就一边看着抽屉里的纸一边在键盘上噼里啪啦的敲起来,不一会就看见出票机里吐出了好几张票(具体到哪我不清楚,因为我离的比较远且我近视),同时那说上海话的女子递给售票员一笔钱,等售票员清点完钞票后又重复着上面的动作。rnrn我前面的等的有点不耐烦了,就嘟噜了几句要售票员卖票给她,售票员趁空隙卖了一张票给我前面的那个人,后面应该是我买了,我跟售票员说“给我一张下星期六的5064去苏州的票”,售票员假装没听见,我又说了一句,该售票员就回了一句“人家买的票比你的早,等会”(注:我搞不明白,卖票是根据排队的还是根据票的时间日期的),这时我就多留了个心眼,看她出的票是到哪的,我只看清楚两次给那说上海话的女子的票(一次是05日到“天水”的票 10 张,另一次是到“彬州”的票 10 张,其余几次因为票面上有钱遮住或票的反面向上看不到),这时我又说了一句“给我一张下星期六的5064去苏州的票”,售票员显得很不耐烦“我怎么知道下星期六是几号啊”,我说“10号”,售票员就把票打出来给我了(票是 2007年02月10日的5064次到苏州的票,座位在02车上001号,可以查到售票记录的),因为那天我还要赶 6点半的火车,就没敢再耽搁,所以就没找相关领导反映。rn 论坛

没有更多推荐了,返回首页