美文网首页
警察小偷问题

警察小偷问题

作者: xmfaly | 来源:发表于2017-12-08 08:59 被阅读0次

警察和小偷需要跑完200米距离,但两个人之间用一个3米的手铐铐住,请实现一个模型,用来描述警察和小偷跑步的情况。
(1)使用线程表现无序性。
(2)使用ncurse表现裕兴界面。
这是一个基本的生产者消费者模型。等待的条件是两人之间的距离不要超过3米。换句话说小偷在跑之前要判断是否小偷比警察的距离多3,如果是那小偷就不能再跑,就要等待警察进程跑。警察进程同样的道理。

完整代码

#include <stdio.h>          
#include <stdlib.h>
#include <time.h>
#include <curses.h>
#include "pthread.h"

//警察和小偷之间的距离
#define DISTANCE 3
//警察纵坐标
#define PY 10

//小偷纵坐标
#define TY 12


struct prodcons
{
    pthread_mutex_t lock;
    int polPos,thiefPos;
    pthread_cond_t notempty;
    pthread_cond_t notfull;
};

struct prodcons buffer;

void init(struct prodcons *b)
{
    pthread_mutex_init(&b->lock,NULL);
    pthread_cond_init(&b->notempty,NULL);
    pthread_cond_init(&b->notfull,NULL);
    b->polPos=0;
    b->thiefPos=0;

    //init ncurses
    initscr();
    crmode();
    noecho();

}

void prun(struct prodcons *b)
{
    pthread_mutex_lock(&b->lock);
    while(b->polPos - b->thiefPos >= DISTANCE)
    {
        printf("wait for t run\n");
        pthread_cond_wait(&b->notfull,&b->lock);
    }
    b->polPos++;

    clear();
    mvaddch(PY,b->polPos,'P');
    mvaddch(TY,b->thiefPos,'T');
    sleep(1);
    refresh();

    if(b->polPos == 200){
        printf("p run over\n");
        exit(0);
    }
    pthread_cond_signal(&b->notempty);
    pthread_mutex_unlock(&b->lock);
}

void trun(struct prodcons *b)
{
    pthread_mutex_lock(&b->lock);
    while( b->thiefPos -  b->polPos >= DISTANCE)
    {
      printf("wait for p run\n");
      pthread_cond_wait(&b->notempty,&b->lock);
    }
    b->thiefPos++;

    clear();
    mvaddch(TY,b->thiefPos,'T');
    mvaddch(PY,b->polPos,'P');

    clrtoeol();
    sleep(1);
    refresh();

    //printf("t poistion is %d\n", b->thiefPos);
    if(b->thiefPos == 200){
        printf("p run over\n");
        exit(0);
    }
    pthread_cond_signal(&b->notfull);
    pthread_mutex_unlock(&b->lock);
}

void * p()
{
    while(1)
    {
        prun(&buffer);
    }
    
    return NULL;
}

void * t()
{
    while(1)
    {
        trun(&buffer);
    }
    return NULL;
}

int main(void)
{
    pthread_t th_a,th_b;            
    void *retval;
    init(&buffer);
    pthread_create(&th_a,NULL,p,NULL);
    pthread_create(&th_b,NULL,t,NULL);
    pthread_join(th_a,&retval);
    pthread_join(th_b,&retval);
    endwin();
    return 0;
}

相关文章

  • 警察小偷问题

    警察和小偷需要跑完200米距离,但两个人之间用一个3米的手铐铐住,请实现一个模型,用来描述警察和小偷跑步的情况。(...

  • 警察与小偷

    警察:你偷过东西吗? 小偷:时而。 警察:在哪里偷过? 小偷:各处。 警察:好吧,先把你关起来。 小偷:几时放我出...

  • RxAndroid笔记

    1. 观察者模式 警察与小偷的例子,警察是观察者,小偷是被观察者。警察锁定小偷,对小偷的种种行为进行反应。Obse...

  • 勇敢的小红。

    小红在便民超市看到了小偷,她赶紧跑出来找警察叔叔。告诉警察叔叔,超市里有小偷。警察叔叔把小偷抓住,然后关进牢...

  • 警察抓小偷(闪小说)

    文‖孙怀军 小时候,儿子和爸爸,最喜欢玩警察抓小偷的游戏。 每次都是,儿子演警察,爸爸演小偷。不论小偷多狡...

  • 我的愿望

    每当我从电视里看到警察抓小偷的时候,总觉得警察很厉害,我长大以后也要当一名警察。虽然警察抓小偷很危险,但是很有意义...

  • 警察和小偷

    “小偷!站住!”大龙不管背后警察大声的叫喊,仍是往前跑着,殊不知前面就是一个死胡同!一堵大墙就这样堵住了他的所有希...

  • 警察抓小偷

    今天我们要简单的说说5岁左右男孩们在一起玩的游戏。 带孩子在小区楼下玩,多在楼下及视野宽阔的地方,对孩子的眼部发育...

  • 警察与小偷

    二娃是个警察,远离家乡,在一个小县城里,安静而努力。 二娃从警第一年做的是案侦民警的工作,真正地接触到社会不安的一...

  • 警察与“小偷”

    想当警察是他们的梦想,彰显公正是他们的初衷,伸张正义是他们的职责,但他们还在警察学校读大学时,做梦也没有想到将来要...

网友评论

      本文标题:警察小偷问题

      本文链接:https://www.haomeiwen.com/subject/ymalixtx.html