在Linux 多线程通信.全局变量,结构体,队列,项目模版(一)一篇文章中
有段代码中有一个,*PtFrame = *Frame,方法是通过指针方式,拷贝数据,速度很快,通过指针指向一个结构体,便可以,实现快速赋值,复制数据,如果是视频数据流,一帧数据是非常的大1000多个字节至少,如果要对数据进行搬移,将会非常耗时,视频会卡顿。解决办法是,将这个队列,定义成结构体类型,每次只传入指针,进行拷贝,第二种是本篇想要验证的,只传指针给队列,快速读写队列,网络接收到数据到buf,buf指针指向malloc申请的地址。这个地址不释放,放在指针数组里,按位移量,给队列。
1、通过指针指向一个结构体
struct data1,data2
struct pdata1,pdata2
pdata1 = data1;
pdata2 = data2;
*pdata2 = *pdata1
*pdata2 = *pdata1 ,是否比memcpy快,可以自己验证一下,写个大的循环,看谁先完成数据拷贝
2、队列指针指向malloc地址,不复制数据
原理简单分析一下
定义一个结构体
typedf struct data
{
int data[1000];
}data, *pdata;
定义多个全局变量指针,
pdata ptrdata1 = (pdata )malloc(dizeof(struct data));
pdata ptrdata2 = (pdata )malloc(dizeof(struct data));
pdata ptrdata3 = (pdata )malloc(dizeof(struct data));
pdata ptrdata4 = (pdata )malloc(dizeof(struct data));
定义一个全局变量指针数组
int * offsetdata[20]
offsetdata[0] = (int *)ptrdata1;
offsetdata[1] = (int *)ptrdata2;
offsetdata[2] = (int *)ptrdata3;
....
定义一个结构体数据类型的,队列,写队列每次只传指针,关于队列,看上一篇,这里只做演示
SX_S32 QUEUE_Frame__Write(QUEUE_Frame *head, int * Frame)
{
struct data *PtFrame = head + s32IndexW; //获取队列的首地址,写偏移量,进行偏移,下一个要的位移地址
int * offset = Frame[s32IndexW];
PtFrame = (struct data)offset ;//强制类型转换回来
s32IndexW = (s32IndexW+1) % size;//队列写偏移指针,位移加1
return 1;
}
调用
int main()
{
QUEUE_Frame *head = (QUEUE_Frame *)malloc(sizeof(QUEUE_Frame ));//定义消息队列首地址
QUEUE_Frame__Write(head, offsetdata)
}
实际编程试试
#include<stdio.h>
#include<stdlib.h>
typedef struct data
{
int num[2];
}DataType,*P_DataType;
int main()
{
P_DataType Head = (P_DataType)malloc(2);
P_DataType data1 = (P_DataType)malloc(2);
P_DataType data2 = (P_DataType)malloc(2);
P_DataType data3 = (P_DataType)malloc(2);
data1->num[0] = 1;
data1->num[1] = 2;
data2->num[0] = 3;
data2->num[1] = 4;
data3->num[0] = 5;
data3->num[1] = 6;
int *prt1 = (int *)data1;
int *prt2 = (int *)data2;
int *prt3 = (int *)data3;
int *a[3] = {prt1,prt2,prt3};
//只复制指针
prt1 = a[0];
Head = (P_DataType)prt1;
printf("finish %d, %d\r\n",Head->num[0],Head->num[1]);
//通过指针复制数据
prt1 = a[1];
P_DataType p = (Head +1);
*p = *((P_DataType)prt1);
printf("finish %d, %d\r\n",p->num[0],p->num[1]);
//memcpy方式,拷贝
prt1 = a[2];
P_DataType p2 = (Head +2);
memcpy(p2,prt1,8);
printf("finish %d, %d\r\n",p2->num[0],p2->num[1]);
return 0;
}
访问数据时正确的。
第一种和第二种哪种快,没验证过,理论上第一种快,没有发生数据拷贝,只是指针指向,第三种估计要慢一点
在音视频编程中,这是非常有用的,实际项目也是这样用过的,保证了我的网络数据包,能够快速写完,编码解码时,非常流畅。