v831-openwrt-c-多线程、队列篇
前言
这几天都在搞多线程和队列,但是最后发现由于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; }