关于linux多线程同步的问题

发布于 2022-09-02 10:17:22 字数 118 浏览 17 评论 0

今天刚自学Linux多线程,对同步机制还不太了解,如下题如何解决?
创建一个线程模拟播放视频(使用while循环打印),main中读取用户输入,当输入为stop时,停止线程播放,当用户输入pause时,暂停线程播放。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

莫多说 2022-09-09 10:17:22

解决了,自问自答自娱自乐吧,代码贴上来供有需要的人参考。

#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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文