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