栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

实现个带锁的队列-用于视频帧信息同步

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实现个带锁的队列-用于视频帧信息同步

#ifndef __SYNC_QUEUE_H_

#define __SYNC_QUEUE_H_

#include

#include

#include

#include

#include

//用于视频帧之间信息同步,

typedef struct SyncData_tag {

  

}SyncData;

typedef struct QNode {

    int64_t pts;

    SyncData data;    

    struct QNode *next;

}QNode, *QueuePtr;

typedef struct {

    QueuePtr front;

    QueuePtr rear;

    pthread_mutex_t mutex;

}linkQueue;

int init_queue(linkQueue *q); //初始化队列

int destroy_queue(linkQueue *q); //销毁队列

int en_queue(linkQueue *q, int64_t pts, const SyncData &d); //从队列尾插入,头节点是空着的

int de_queue(linkQueue *q, int64_t pts, SyncData *d); //根据pts取数据

void dump_queue(linkQueue *q); 

//实现的这个队列的作用是在视频帧之间同步信息,只能是C语言的

#endif

#include "sync_queue.h"

void *Malloc(size_t s)

{

    void *ptr = malloc(s);

    memset(ptr, 0x0, s);

    return ptr;

}

int init_queue(linkQueue *q)

{

    q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));

    if (!q->front) {

        return -1;

    }

    q->front->next = NULL;

    pthread_mutex_init(&q->mutex, NULL);

    return 0; 

}

int destroy_queue(linkQueue *q)

{

    pthread_mutex_lock(&q->mutex);

    while (q->front) {

        q->rear = q->front->next;       

        free(q->front);   

        q->front = q->rear;   

    

    }

    pthread_mutex_unlock(&q->mutex);   

    return 0;

}

int en_queue(linkQueue *q, int64_t pts, const SyncData &d)

{

    QueuePtr p = (QueuePtr)Malloc(sizeof(QNode));

    if (!p) {

        return -1;

    }

    pthread_mutex_lock(&q->mutex);

    p->pts = pts;

    p->data = d;    

    p->next = NULL;

    q->rear->next = p; //从队列尾插入

    q->rear = p; //调整队列尾

    pthread_mutex_unlock(&q->mutex);    

    return 0;

}

int de_queue(linkQueue *q, const int64_t pts, SyncData *d)

{

    if (q->front == q->rear) {

        return 1;

    }

    pthread_mutex_lock(&q->mutex);

    if (q->front == q->rear) {

        pthread_mutex_unlock(&q->mutex);

        return 1;

    }

    int found = 0;

    QueuePtr p = q->front;    

    while (p->next) {

        if (p->next->pts == pts) { //先找到对应的节点

    *d = p->next->data;

            QueuePtr n = p->next;

            p->next = p->next->next; //移除节点关系链

            if (q->rear == n) {

        q->rear = q->front;

    }

    free(n); //实际删除节点

            found = 1;    

}

        p = p->next;

    }

    if (found == 0) {

        return 2;

    }

    pthread_mutex_unlock(&q->mutex);

    return 0;

}

void dump_queue(linkQueue *q) 

{

    QueuePtr p = q->front->next;    

    while (p) {

        printf("%ld->", p->pts);

        p = p->next;

    }

    printf("n");

}

int main()

{

    linkQueue q;

    init_queue(&q);

    SyncData v;

    int64_t pts = 128;

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    en_queue(&q, pts++, v);

    SyncData get;

    de_queue(&q, 131, &get);

    dump_queue(&q);

    en_queue(&q, pts--, v);

    dump_queue(&q);

    en_queue(&q, pts--, v);

    dump_queue(&q);

    en_queue(&q, pts--, v);

    dump_queue(&q);

    en_queue(&q, pts--, v);

    dump_queue(&q);

    en_queue(&q, pts--, v);

    dump_queue(&q);

    de_queue(&q, 128, &get);

    de_queue(&q, 256, &get);

    dump_queue(&q);

    en_queue(&q, pts--, v);

    dump_queue(&q);

    en_queue(&q, pts--, v);

    dump_queue(&q);

    en_queue(&q, pts--, v);

    dump_queue(&q);

    en_queue(&q, pts--, v);

    dump_queue(&q);

    return 0;

}

验证对列正确性:

128->129->130->132->133->134->135->136->137->138->139->140->141->

128->129->130->132->133->134->135->136->137->138->139->140->141->142->

128->129->130->132->133->134->135->136->137->138->139->140->141->142->141->

128->129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->

128->129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->

128->129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->

129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->

129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->137->

129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->137->136->

129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->137->136->135->

129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->137->136->135->134->

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352571.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号