当前位置:  技术问答>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一块内存,只在一个线程中写入,在多个线程读出,请问下这样也需要用到互斥锁吗,谢谢,需要同步吗

|
不过要从你实际编码实现角度,你需要使用互斥锁+条件变量.

1个写线程加锁写,写完一次数据就cond_brocast一次 . 写线程全部写完后设置EOF标记位,并cond_brocast一次让所有读线程完成任务并退出.

N个读线程加锁读,如果发现没数据读了,那么cond_wait,等待被写线程唤醒. 如果发现没数据读且EOF位设置,那么读任务结束. 

实际编码时,每个读线程拥有自己独占的读偏移量,所有读线程+写线程拥有共享的写偏移量.

一个读线程阻塞的条件是自己的读偏移量和共享的写偏移量相同.

如果你的想法不是所有读线程获取同样的数据备份,那么可以将读偏移量共享,那么就是N个读线程瓜分同一份数据的不同段落,你自己设计.

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问,去会字符串型的日期,如何转化成datetime型从而写入数据库?如果不转换,能写入吗?(多谢)?
  • 对于自己写的文件系统,自己写格式化程序时除了写入dbr,还要向系统写入什么信息.
  • 写入Access2000出现No ResultSet was produced错误,但数据已经写入,部分语句如下:
  • 如何确定数据已经从内核缓冲区写入磁盘了?
  • 故障求助:linux系统无法向磁盘写入文件
  • 在Applet中怎么样象硬盘写入一个文本文件?
  • 如何用java对paradox写入数据?
  • 关于Oracle BLOB类型,一个String字符怎么写入BLOB字段? iis7站长之家
  • 如何把一个文本内的内容一次性写入crontab里
  • 日志写入命名管道的权限问题
  • img文件系统如何写入开发板
  • 如何判断文件正在被写入
  • window写入缓存失败是什么原因
  • 多进程问题 子进程读取内容 读完挂起,父进程写 写入后唤醒子进程
  • syslog函数无法写入日志信息
  • 怎样把回车写入文件中?
  • 关于Oracle BLOB类型,一个String字符怎么写入BLOB字段?
  • 请问在QT中怎样将一个QString型的字串写入FILE文件中???
  • 如何在Windows下向Linux分区写入文件?
  • 怎样把编译的信息写入一个文件


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3