多线程访问固定大小缓冲区的疑问

u俺的me 2020-04-07 02:23:13
我有2个线程,分别是thread_1和thread_2;
thread_1负责从某个地方一直读取数据到buf,thread_2负责一直从buf中取出数据通过usb口发送出去;
由于某些原因(不赘述),thread_2取数据时需要直接拿到thread_1那个buf的地址,也就是说取数据时不能memcpy,因为多了一层拷贝会导致速率很慢;

现在的疑问是:如果保证两个线程都能并行运行?
谢谢大佬们了!

目前只能想到的方案是:搞2个buf,毕竟多数时间下,thread_1的填充buf的速率远大于thread_2的取出速率,这样thread_2就每次去另一个buf取数据,不知道有没有更好的办法?
...全文
211 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2020-04-08
  • 打赏
  • 举报
回复
当你都要加锁的时候,那memcpy的效率损失也就不应该成为瓶颈了。
u俺的me 2020-04-08
  • 打赏
  • 举报
回复
引用 5 楼 truexf 的回复:
用一个buf,实现一个环形队列。记住写入的位置和读取的位置,读写的时候先计算读写位置是否冲突(写满了再写等待,读完再读等待)。可以采取加锁处理,也可以用原子指令实现无锁。

恩,可以考虑,我试试
u俺的me 2020-04-08
  • 打赏
  • 举报
回复
引用 6 楼 @风轻云淡_ 的回复:
在外面申请一块大内存和一个锁,分别将地址和锁传入两个线程,子线程读写时加锁就可以了,有什么难以实现的吗 。共享内存+互斥锁就可以实现你的要求

这个方法我试过了,在两个线程都工作、频繁申请加、解锁的时候,效率低下。
u俺的me 2020-04-08
  • 打赏
  • 举报
回复
引用 9 楼 taodm 的回复:
当你都要加锁的时候,那memcpy的效率损失也就不应该成为瓶颈了。

可是不加锁也很难保证数据访问的原子性,写数据和读数据的速率都在几百MBps,拷贝确实很耗时。
@风轻云淡_ 2020-04-07
  • 打赏
  • 举报
回复
在外面申请一块大内存和一个锁,分别将地址和锁传入两个线程,子线程读写时加锁就可以了,有什么难以实现的吗 。共享内存+互斥锁就可以实现你的要求
「已注销」 2020-04-07
  • 打赏
  • 举报
回复
用一个buf,实现一个环形队列。记住写入的位置和读取的位置,读写的时候先计算读写位置是否冲突(写满了再写等待,读完再读等待)。可以采取加锁处理,也可以用原子指令实现无锁。
u俺的me 2020-04-07
  • 打赏
  • 举报
回复
引用 2 楼 smwhotjay 的回复:

数据传输。可以考虑管道,socket,db,甚至写入文件来交换,
如果win下,一个写一个读,多线程,可以考虑利用iocp投递消息,避免了锁的麻烦。


是在Linux下的编程,数据来源使用的库接口要求buf地址必须是cma的(malloc出来的连续内存)。。
u俺的me 2020-04-07
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
2个bufu不是不可以,比如thread1设置一个标志识别哪个buf正在填充中,thread2根据标志从另一个buf取数据,并保证好原子性就好了。
问题是,如果thread1太快,thread2太慢,怎么办?还要考虑加锁。
所以我觉得或许可以考虑使用管道。

目前数据来源使用的库接口要求buf地址必须是cma的(malloc出来的连续内存),所以没法用管道
smwhotjay 2020-04-07
  • 打赏
  • 举报
回复

数据传输。可以考虑管道,socket,db,甚至写入文件来交换,
如果win下,一个写一个读,多线程,可以考虑利用iocp投递消息,避免了锁的麻烦。
qybao 2020-04-07
  • 打赏
  • 举报
回复
2个bufu不是不可以,比如thread1设置一个标志识别哪个buf正在填充中,thread2根据标志从另一个buf取数据,并保证好原子性就好了。
问题是,如果thread1太快,thread2太慢,怎么办?还要考虑加锁。
所以我觉得或许可以考虑使用管道。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧