• 大小: 2.3 KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2024-10-09
  • 语言: 其他
  • 标签: linux  C  电梯  练习  

资源简介

这是我上班的时候无聊的时候写的,我的基本思路是,在程序的初始化阶段起两个线程,一个是用户输出线程,另一个是电梯运行线程。这两个线程共享一个电梯(结构体),用户输出的命令会根据自己定下的规则加入到命令链表中,电梯线程会根据链表的命令执行。

资源截图

代码片段和文件信息

#include “lift.h“

ONE_LIFT_T *lift = NULL;
pthread_t lift_thread;
pthread_t user_thread;

/*create a lift struct*/
ONE_LIFT_T* creatLift(){
ONE_LIFT_T *lift;
lift = (ONE_LIFT_T*)malloc(sizeof(ONE_LIFT_T));
lift->status = STATUS_STOPPING;
lift->floor = 1;
lift->commands = creatCmd(“1-“); //default floor on 1
lift->direction = DIRECTION_NULL;

return lift;
}

/*lift running thread function*/
void *liftThread(void* p){
ONE_LIFT_T *_lift = (ONE_LIFT_T*)p;
printf(“lift cur floor is %d\n“_lift->commands->floor);
while(1){
if(_lift->commands != NULL){
if(_lift->commands->next != NULL){
_lift->status = STATUS_RUNNING; //set lift status
if(_lift->commands->floor < _lift->commands->next->floor){
_lift->commands->floor++;
_lift->commands->direction = DIRECTION_UP; //set lift running direction
}
else if(_lift->commands->floor > _lift->commands->next->floor){
_lift->commands->floor--;
_lift->commands->direction = DIRECTION_DOWN;
}
else{ //_lift->commands->floor == _lift->commands->next->floor
delFirstCmd(&(_lift->commands));
printf(“lift is arrive : %d\n“_lift->commands->floor);
if(_lift->commands->next != NULL){
_lift->status = STATUS_WAITTING;
}
else{
_lift->status = STATUS_STOPPING;
_lift->commands->direction = DIRECTION_NULL;
}

}
printf(“lift cur floor is %d\n“_lift->commands->floor);
}
}
sleep(2); //arrive next floor need 2 sec
}
}

/*user operate thread*/
void *userThread(void* p){
ONE_LIFT_T *_lift = (ONE_LIFT_T*)p;
int ret;
while(1){
char cmd[2];
scanf(“%s“cmd);
//这里使用正则表达式最好
if((cmd[0] >= ‘1‘ && cmd[0] <= ‘9‘) && 
 (cmd[1] == ‘-‘ || cmd[1] == ‘+‘ || cmd[1] == ‘*‘) &&
 (strlen(cmd) <= 2)
){
//if user input correct cmd  it will create a cmd to list
ret = addCmd(_lift->commandscreatCmd(cmd));
if(ret != 0)
printf(“Add user command fail!\nIt may be full!\n“);
}
else{
printf(“Usage: nd n(1~9) d(-+)\n“);
}
}
}

/*lift test init*/
void initThreads(){
lift = creatLift();
int ret;
ret = pthread_create(&lift_threadNULLliftThread(void*)lift);
if(ret != 0){
printf(“Create lift thread fail!\n“);
}

ret = pthread_create(&user_threadNULLuserThread(void*)lift);
if(ret != 0){
printf(“Create user thread fail!\n“);
}
}

/*waitting the lift thread and user thread for stop*/
void waitThreads(){
if(lift_thread != 0){
pthread_join(lift_threadNULL);
}
if(user_thread != 0){
pthread_join(user_threadNULL);
}
}


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1903  2014-03-05 10:01  lift_cmd.c

     文件        971  2014-03-05 09:55  lift.h

     文件       2680  2014-03-05 09:55  lift.c

     文件        108  2014-03-05 09:55  Main.c

----------- ---------  ---------- -----  ----

                 5662                    4


评论

共有 条评论