今天刚自学Linux多线程,对同步机制还不太了解,如下题如何解决?创建一个线程模拟播放视频(使用while循环打印),main中读取用户输入,当输入为stop时,停止线程播放,当用户输入pause时,暂停线程播放。
解决了,自问自答自娱自乐吧,代码贴上来供有需要的人参考。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <semaphore.h> #define SIZE 1024 #define TIMER 5 #define LENTH 4 char buffer[SIZE]; pthread_mutex_t mutex; //设置初始化互斥量 pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //设置线程挂起和回复的条件变量 void *thread_play_0(void *arg); void Error_print(int num,char *pStr) //封装一个检测函数,主要检测线程的建立等一系列操作是否正确 { if(num != 0) { perror(pStr); exit(EXIT_FAILURE); } } int main(void) { int ret; pthread_t id; //创建线程 pthread_attr_t thread_attr; //设置线程属性 ret = pthread_attr_init(&thread_attr); Error_print(ret,"Init error\n"); ret = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); //设线程属性为脱离,线程结束后不需要返回,能在后台与主线同时执行 Error_print(ret,"Init error\n"); ret = pthread_mutex_init(&mutex,NULL); Error_print(ret,"Init error\n"); ret = pthread_create(&id, &thread_attr,thread_play_0,NULL); Error_print(ret,"Create error\n"); while(scanf("%s",buffer)) { //设置恢复和退出条件 if(strncmp("stop",buffer,LENTH) == 0) { //退出 pthread_mutex_lock(&mutex); printf("-------Goodbye-------\n"); sleep(1); break; } if(strncmp("start",buffer,TIMER) == 0) { //恢复线程 pthread_mutex_lock(&mutex); pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); sleep(1); } } exit(EXIT_SUCCESS); } void *thread_play_0(void *arg) //线程执行函数 { while (1) { pthread_mutex_lock(&mutex); //循环打印 printf("It's a flash,input stop to stop,input pause to pause.\n"); pthread_mutex_unlock(&mutex); sleep(1); if (strncmp("stop", buffer, LENTH) == 0) { //退出线程 break; } if (strncmp("pause", buffer, TIMER) == 0) { //挂起线程 strcpy(buffer," "); pthread_mutex_lock(&mutex); printf("---------Flash is paused---------\n"); printf("Input start to play the flash again.\n"); pthread_cond_wait(&cond,&mutex); pthread_mutex_unlock(&mutex); } } pthread_exit(NULL); }
解决了,自问自答自娱自乐吧,代码贴上来供有需要的人参考。