当前位置: 技术问答>linux和unix
一个写入多个读出的同步问题
来源: 互联网 发布时间:2017-01-18
本文导语: 各位: 问下buffer同步的问题: 现在有一个结构体: typedef struct SnoSENDBUF_S { HI_U32 TotalSize; /*发送缓冲总大小*/ HI_U32 bufferlen; /*压缩好的数据实际...
各位:
问下buffer同步的问题:
现在有一个结构体:
typedef struct SnoSENDBUF_S
{
HI_U32 TotalSize; /*发送缓冲总大小*/
HI_U32 bufferlen; /*压缩好的数据实际在这块内存中的长度*/
HI_U8 *StartPhyAddr; /*发送缓冲物理地址*/
HI_U8 *StartVrtAddr; /*发送缓冲虚拟地址*/
HI_U32 u32Seq; /*当前的序列号*/
HI_U64 u64PTS;
HI_BOOL bFieldEnd; /* 一场结束标志*/
HI_BOOL bFrameEnd; /* 一帧结束标志*/
VENC_DATA_TYPE_U DataType; /*当前数据流的类型*/
}SEND_BUF_S;
我用这个结构体定义了一个全局变量,只在一个线程中写入,在多个线程读出,请问下这样的程序需要用到互斥锁吗
还有就是 我malloc一块内存,只在一个线程中写入,在多个线程读出,请问下这样也需要用到互斥锁吗,谢谢,需要同步吗
问下buffer同步的问题:
现在有一个结构体:
typedef struct SnoSENDBUF_S
{
HI_U32 TotalSize; /*发送缓冲总大小*/
HI_U32 bufferlen; /*压缩好的数据实际在这块内存中的长度*/
HI_U8 *StartPhyAddr; /*发送缓冲物理地址*/
HI_U8 *StartVrtAddr; /*发送缓冲虚拟地址*/
HI_U32 u32Seq; /*当前的序列号*/
HI_U64 u64PTS;
HI_BOOL bFieldEnd; /* 一场结束标志*/
HI_BOOL bFrameEnd; /* 一帧结束标志*/
VENC_DATA_TYPE_U DataType; /*当前数据流的类型*/
}SEND_BUF_S;
我用这个结构体定义了一个全局变量,只在一个线程中写入,在多个线程读出,请问下这样的程序需要用到互斥锁吗
还有就是 我malloc一块内存,只在一个线程中写入,在多个线程读出,请问下这样也需要用到互斥锁吗,谢谢,需要同步吗
|
不过要从你实际编码实现角度,你需要使用互斥锁+条件变量.
1个写线程加锁写,写完一次数据就cond_brocast一次 . 写线程全部写完后设置EOF标记位,并cond_brocast一次让所有读线程完成任务并退出.
N个读线程加锁读,如果发现没数据读了,那么cond_wait,等待被写线程唤醒. 如果发现没数据读且EOF位设置,那么读任务结束.
实际编码时,每个读线程拥有自己独占的读偏移量,所有读线程+写线程拥有共享的写偏移量.
一个读线程阻塞的条件是自己的读偏移量和共享的写偏移量相同.
如果你的想法不是所有读线程获取同样的数据备份,那么可以将读偏移量共享,那么就是N个读线程瓜分同一份数据的不同段落,你自己设计.
1个写线程加锁写,写完一次数据就cond_brocast一次 . 写线程全部写完后设置EOF标记位,并cond_brocast一次让所有读线程完成任务并退出.
N个读线程加锁读,如果发现没数据读了,那么cond_wait,等待被写线程唤醒. 如果发现没数据读且EOF位设置,那么读任务结束.
实际编码时,每个读线程拥有自己独占的读偏移量,所有读线程+写线程拥有共享的写偏移量.
一个读线程阻塞的条件是自己的读偏移量和共享的写偏移量相同.
如果你的想法不是所有读线程获取同样的数据备份,那么可以将读偏移量共享,那么就是N个读线程瓜分同一份数据的不同段落,你自己设计.