v831-openwrt-c-多线程、队列篇

发布时间 2023-06-13 22:45:35作者: 悠闲的小莫

前言

这几天都在搞多线程和队列,但是最后发现由于v831的单核,用了多线程和队列还不如不用,并且吐槽一下c的线程和队列库,特别队列库很难用。

线程库

#include <pthread.h>            //系统的多线程文件

使用条例:

使用的很简单,网上的说明很清楚,不需要详细说明

指向

感悟

很鸡肋,如果不是需要多线操作的场景,感觉没啥用。

队列库

#include <sys/queue.h>

使用条例(这里面全是宏定义操作,很难看)

指向

通过系统队列库写的队列操作

头文件

c文件

 

#include "moqueue.h"

// #define MO_QUE_ST(size) struct test{\
//     uint8_t data[size];\
//     SIMPLEQ_ENTRY(test) next;}     //指向下一个结构体的

struct test                        //使用系统队列之前需要定义里面的数据
{
    void *data;          //数据
    uint16_t n;             //个数
    uint16_t size;          //目前个数
    uint32_t maxsize;       //最大数据数量
    SIMPLEQ_ENTRY(test) next;     //指向下一个结构体的
};

mo_error_t moqueue_creat(send_data_t **moque)
{
    *moque=(send_data_t*)malloc(sizeof(send_data_t));
    SIMPLEQ_INIT(*moque);
    return mo_ok;
}

//句柄、个数、大小、数据
mo_error_t moqueue_add(send_data_t *moque,uint16_t n,uint32_t size,void *dat)
{
    struct test *handle;
    handle=(struct test*)malloc(sizeof(struct test));
    if(handle==NULL)
       return mo_error;

    memset(handle,0,sizeof(struct test));               //初始化为0
    handle->data=(uint8_t*)malloc(size);                //分配数据大小
    if(handle->data==NULL)
        return mo_error;

    handle->maxsize=size;
    //printf("maixsize is %d",handle->maxsize);
    handle->n=n;                                        //个数

    memcpy(handle->data,dat,size);
    
    if(mo_isempty(moque)!=mo_ok)                           //如果不为空
    {
        handle->size=(SIMPLEQ_FIRST(moque)->size)+1;    //目前个数+1
        //printf("size is %d\r\n",handle->size);
    }
    (handle)->next.sqe_next = NULL;                    
    *(moque)->sqh_last = (handle);                    
    (moque)->sqh_last = &(handle)->next.sqe_next;
    //printf("queu is empty? %d\r\n",mo_isempty(moque));
    //SIMPLEQ_INSERT_TAIL(moque,handle,next);             //队列尾部插入
    return mo_ok;
}


//句柄、大小、数据(数据未释放,需要自己释放)
mo_error_t moqueue_take(send_data_t *moque,uint32_t *size,void **dat)
{
    if(mo_isempty(moque)==mo_ok)
        return mo_error;
    // if(mo_isfull(moque)==mo_ok/* SIMPLEQ_FIRST(moque)->size==SIMPLEQ_FIRST(moque)->n */)             //满了
    //     return mo_error;

    *size=SIMPLEQ_FIRST(moque)->maxsize;                                 //输出数据大小
    *dat=(uint8_t*)(SIMPLEQ_FIRST(moque)->data);                           //在这里必须用指针的指针,不然就会换地址
    free(SIMPLEQ_FIRST(moque));
    SIMPLEQ_REMOVE_HEAD(moque,next);
    return mo_ok;
}


mo_error_t mo_isempty(send_data_t *moque)
{
    if(SIMPLEQ_EMPTY(moque))
        return mo_ok;
    else
        return mo_error;
}

mo_error_t mo_isfull(send_data_t *moque)
{
    if(mo_isempty(moque)==mo_ok)
        return mo_error;
    if(SIMPLEQ_FIRST(moque)->size==SIMPLEQ_FIRST(moque)->n)             //满了
        return mo_ok;
    else
        return mo_error;
}