智能安防项目模型

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>

enum event
{
    THIEF = 1,//小偷来了
    FIRE = 2,//发生火灾
    STOP = 3,//停止所有警报
    QUIT = 4   //程序结束
};

pthread_t tid[5]={0};
int ret = 0;
int flag = 0;//所有警告打开和结束标志

//定义互斥锁
pthread_mutex_t led_lock;
pthread_mutex_t camera_lock;
pthread_mutex_t alarm_lock;
pthread_mutex_t gprs_lock;
pthread_mutex_t fire_lock;

//定义条件变量
pthread_cond_t led_cond;
pthread_cond_t camera_cond;
pthread_cond_t alarm_cond;
pthread_cond_t gprs_cond;
pthread_cond_t fire_cond;

//初始化互斥锁
void init_pthread_lock()
{
    pthread_mutex_init(&led_lock,NULL);
    pthread_mutex_init(&camera_lock,NULL);
    pthread_mutex_init(&alarm_lock,NULL);
    pthread_mutex_init(&gprs_lock,NULL);
    pthread_mutex_init(&fire_lock,NULL);
    return;
}

//初始化条件变量
void init_pthread_cond()
{
    pthread_cond_init(&led_cond,NULL);
    pthread_cond_init(&camera_cond,NULL);
    pthread_cond_init(&alarm_cond,NULL);
    pthread_cond_init(&gprs_cond,NULL);
    pthread_cond_init(&fire_cond,NULL);
    return;
}


//LED灯闪烁提示
void* led_thread(void *arg)
{
    while(1)
    {
       pthread_mutex_lock(&led_lock);
       pthread_cond_wait(&led_cond,&led_lock);
       pthread_mutex_unlock(&led_lock);
    
        while(flag)
        {
           puts("-------------led-------------\n");
           sleep(1);
        }
    }
    return NULL;
}

//camera摄像
void* camera_thread(void *arg)
{
    while(1)
    {
       pthread_mutex_lock(&camera_lock);
       pthread_cond_wait(&camera_cond,&camera_lock);
       pthread_mutex_unlock(&camera_lock);
    
         while(flag)
        {
           puts("-------------camera-------------\n");
           sleep(1);
        }
    }
    return NULL;
}

//alarm响铃警报
void* alarm_thread(void *arg)
{
    while(1)
    {
       pthread_mutex_lock(&alarm_lock);
       pthread_cond_wait(&alarm_cond,&alarm_lock);
       pthread_mutex_unlock(&alarm_lock);
    
        while(flag)
        {
           puts("-------------alarm-------------\n");
           sleep(1);
        }
    }
    return NULL;
}

//GPRS发送短信通知
void* gprs_thread(void *arg)
{
    while(1)
    {
       pthread_mutex_lock(&gprs_lock);
       pthread_cond_wait(&gprs_cond,&gprs_lock);
       pthread_mutex_unlock(&gprs_lock);
    
        while(flag)
        {
           puts("-------------gprs-------------\n");
           sleep(1);
        }
    }
    return NULL;
}

//火灾提示
void* fire_thread(void *arg)
{
    while(1)
    {
       pthread_mutex_lock(&fire_lock);
       pthread_cond_wait(&fire_cond,&fire_lock);
       pthread_mutex_unlock(&fire_lock);
    
        while(flag)
        {
           puts("-------------fire-------------\n");
           sleep(1);
        }
    }
    return NULL;
}


void create_pthread()//创建所有线程
{
    ret = pthread_create(&tid[0],NULL,led_thread,NULL);
    if(ret != 0)
    {
        fprintf(stderr,"fail to pthread_create %s:\n",strerror(ret));
        exit(EXIT_FAILURE);
    }
    
    ret = pthread_create(&tid[1],NULL,camera_thread,NULL);
    if(ret != 0)
    {
        fprintf(stderr,"fail to pthread_create %s:\n",strerror(ret));
        exit(EXIT_FAILURE);
    }
    
    ret = pthread_create(&tid[2],NULL,alarm_thread,NULL);
    if(ret != 0)
    {
        fprintf(stderr,"fail to pthread_create %s:\n",strerror(ret));
        exit(EXIT_FAILURE);
    }
    
    ret = pthread_create(&tid[3],NULL,gprs_thread,NULL);
    if(ret != 0)
    {
        fprintf(stderr,"fail to pthread_create %s:\n",strerror(ret));
        exit(EXIT_FAILURE);
    }
    
    ret = pthread_create(&tid[4],NULL,fire_thread,NULL);
    if(ret != 0)
    {
        fprintf(stderr,"fail to pthread_create %s:\n",strerror(ret));
        exit(EXIT_FAILURE);
    }
    return;
}

int main(int argc, const char *argv[])
{
    int CMD = 0;
    int i = 0;

    create_pthread();
    init_pthread_lock();
    init_pthread_lock();

while(1)
{
    printf("please input [1-4] select [THIEF FIRE STOP QUIT]:\n");
    scanf("%d",&CMD);
    getchar();

    switch(CMD)
    {
        case THIEF:
        flag = 1;
        pthread_cond_signal(&led_cond);
        pthread_cond_signal(&camera_cond);
        pthread_cond_signal(&alarm_cond);
        pthread_cond_signal(&gprs_cond);
        break;

        case FIRE:
        flag = 1;
        pthread_cond_signal(&alarm_cond);
        pthread_cond_signal(&gprs_cond);
        pthread_cond_signal(&fire_cond);
        break;
        
        case QUIT:
        goto loop;
        break;

        case STOP:
        flag = 0;
        break;

        default:
        puts("command error!");
        break;
    }
}

loop:
    for(i = 0;i < 5;i++)
    {
        pthread_cancel(tid[i]);//取消所有线程执行
    }

    pthread_join(tid[0],NULL);
    pthread_join(tid[1],NULL);
    pthread_join(tid[2],NULL);
    pthread_join(tid[3],NULL);
    pthread_join(tid[4],NULL);

    exit(EXIT_SUCCESS);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屁小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值