//互斥锁和条件变量实际开发中应用

//下面是游戏的注册、登陆、玩游戏、停止、退出

#include <stdio.h>



#include <pthread.h>



#include <unistd.h>



#include <string.h>



#include <stdlib.h>



#define USER_REGISTER 1



#define USER_LOGIN 2



#define USER_PLAY 3



#define USER_QUIT 4



#define USER_STOP 5






//1.互斥锁定义



pthread_mutex_t register_lock;



pthread_mutex_t login_lock;



pthread_mutex_t play_lock;



//条件变量定义



pthread_cond_t register_cond;



pthread_cond_t login_cond;



pthread_cond_t play_cond;






int flag = 0;



pthread_t tid[3] = {0};






//2.互斥锁的初始化



void init_pthread_lock()



{



pthread_mutex_init(®ister_lock,NULL);



pthread_mutex_init(&login_lock,NULL);



pthread_mutex_init(&play_lock,NULL);



return;



}






//条件变量出始化



void init_pthread_cond()



{



pthread_cond_init(®ister_cond,NULL);



pthread_cond_init(&login_cond,NULL);



pthread_cond_init(&play_cond,NULL);



return;



}






void *thread_register(void *arg)



{



while(1)



{



pthread_mutex_lock(®ister_lock);//上锁



pthread_cond_wait(®ister_cond,®ister_lock);//等待信号



pthread_mutex_unlock(®ister_lock);//解锁



while(flag)



{



puts("----------register-------------");



sleep(1);



}



}



}






void *thread_login(void* arg)



{



while(1)



{



pthread_mutex_lock(&login_lock);



pthread_cond_wait(&login_cond,&login_lock);



pthread_mutex_unlock(&login_lock);



while(flag)



{



puts("-----------login---------------");



sleep(1);



}



}



}






void *thread_play(void *arg)



{



while(1)



{



pthread_mutex_lock(&play_lock);



pthread_cond_wait(&play_cond,&play_lock);



pthread_mutex_unlock(&play_lock);



while(flag)



{



puts("-----------play--------------");



sleep(1);



}







}



}















void create_thread()



{



int ret = 0;



ret = pthread_create(&tid[0],NULL,thread_register,NULL);



if(ret != 0)



{



fprintf(stderr,"fail to pthread_create:%s\n",strerror(ret));



exit(EXIT_FAILURE);



}






ret = pthread_create(&tid[1],NULL,thread_login,NULL);



if(ret != 0)



{



fprintf(stderr,"fail to pthread_create:%s\n",strerror(ret));



exit(EXIT_FAILURE);



}






ret = pthread_create(&tid[2],NULL,thread_play,NULL);



if(ret != 0)



{



fprintf(stderr,"fail to pthread_create:%s",strerror(ret));



exit(EXIT_FAILURE);



}



}












int main(int argc, const char *argv[])



{



int cmd = 0,i = 0;






init_pthread_lock();



init_pthread_cond();






create_thread();






while(1)



{



printf("please input [1-5] select [register,login,game,quit,stop:\n");



scanf("%d",&cmd);



//getchar();






switch(cmd)



{



case USER_REGISTER:



flag = 1;



pthread_cond_signal(®ister_cond);//发送信号



break;



case USER_LOGIN:



flag = 1;



pthread_cond_signal(&login_cond);



break;



case USER_PLAY:



pthread_cond_signal(&play_cond);



flag = 1;



break;



case USER_QUIT:



goto loop;



break;



case USER_STOP:



flag = 0;



break;



}



}






loop:



for(i = 0;i < 3;i++)



{



pthread_cancel(tid[i]);



}



printf("GAME OVER!\n");







pthread_join(tid[0],NULL);



pthread_join(tid[1],NULL);



pthread_join(tid[2],NULL);



exit(EXIT_SUCCESS);






return 0;



}