linux下多线程同步输出的问题

qshhnkf 2009-12-23 01:34:44
遇到了点问题:多线程网络编程,两个线程,一个线程负责收包(UDP)接收到包后打印出包内信息,另一个线程接受命令行用户输入,然后解析输入,发包。每次用户输入前,我想在命令行输出一个提示符,然后不允许收包线程向控制台输出信息,直到用户完成一次输入。不知道该如何实现。我想过用锁和条件变量控制线程同步,但是主线程等待输入会引起收包线程长时间等待,由于用的UDP,又没有重发机制,感觉这样很容易丢包。
还请诸位朋友帮帮忙,谢谢先!
...全文
205 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qshhnkf 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 do_fork 的回复:]
包数量不大的话,放内存(硬盘)缓冲区,搞成队列

A: 接受用户输入, 解析并将发送的报文放入发送缓冲区队尾,每次输入完毕后从B中取数据包输出信息
B: 接收udp包,放入接收缓冲区队尾
C: 将发送缓冲区队头报文取出并发送

先测试加锁整个队列时的性能,如果锁的开销过大,尝试使用更细粒度的锁,如锁住每个队列中的元素

不管用什么样的方式,如果报文数量很大,总会有丢包,内核可能会为你丢,甚至硬件可能会为你丢,
试想一下,一个10M能力的网卡,在没有拥塞控制的情况下,接受一个1000M网卡的狠狠发包,能不丢吗,
udp协议本身就不可靠,无法做到一定不丢包或者一定不重复,甚至顺序都无法保证,
如果需要可靠,必须用更可靠的tcp协议,或者通过自己的协议以udp方式实现可靠的传输,
OSI的7层参考模型,每一层都可以加入可靠性传输,在不同的层实现,成本和收货是不同的

总之,高负载情况下,总会有这样那样的因素导致一些惊讶的事情,
良好的设计可以缓解这种压力,但是不可能药到病除
[/Quote]
呵呵,看来我想的太简单了,之前设计没弄好.
不过,系统不是为标准输出保留的有缓冲区嘛,能不能手动控制何时刷新这个缓冲区呢?意思是说,手动调用下flush才会输出,否则就不输出.
ProgrammerNO1 2009-12-23
  • 打赏
  • 举报
回复
learning
jixingzhong 2009-12-23
  • 打赏
  • 举报
回复
线程同步有多种实现方式,可以先看看相关资料,然后选择某一种方法予以实现
KnowKjava 2009-12-23
  • 打赏
  • 举报
回复
接收udp包
liubuweiright 2009-12-23
  • 打赏
  • 举报
回复
学习。。。
jackyjkchen 2009-12-23
  • 打赏
  • 举报
回复
我在做一个类似的东西,不过比你的复杂,5个线程,收、发、计算、数据库操作……总体上就是对列表的维护,通常队列不是线程安全的,要拥互斥体、线程锁等维护
do_fork 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qshhnkf 的回复:]
引用 1 楼 do_fork 的回复:
包数量不大的话,放内存(硬盘)缓冲区,搞成队列

A: 接受用户输入, 解析并将发送的报文放入发送缓冲区队尾,每次输入完毕后从B中取数据包输出信息
B: 接收udp包,放入接收缓冲区队尾
C: 将发送缓冲区队头报文取出并发送

先测试加锁整个队列时的性能,如果锁的开销过大,尝试使用更细粒度的锁,如锁住每个队列中的元素

不管用什么样的方式,如果报文数量很大,总会有丢包,内核可能会为你丢,甚至硬件可能会为你丢,
试想一下,一个10M能力的网卡,在没有拥塞控制的情况下,接受一个1000M网卡的狠狠发包,能不丢吗,
udp协议本身就不可靠,无法做到一定不丢包或者一定不重复,甚至顺序都无法保证,
如果需要可靠,必须用更可靠的tcp协议,或者通过自己的协议以udp方式实现可靠的传输,
OSI的7层参考模型,每一层都可以加入可靠性传输,在不同的层实现,成本和收货是不同的

总之,高负载情况下,总会有这样那样的因素导致一些惊讶的事情,
良好的设计可以缓解这种压力,但是不可能药到病除

呵呵,看来我想的太简单了,之前设计没弄好.
不过,系统不是为标准输出保留的有缓冲区嘛,能不能手动控制何时刷新这个缓冲区呢?意思是说,手动调用下flush才会输出,否则就不输出.
[/Quote]

这个思路不可行
do_fork 2009-12-23
  • 打赏
  • 举报
回复
包数量不大的话,放内存(硬盘)缓冲区,搞成队列

A: 接受用户输入, 解析并将发送的报文放入发送缓冲区队尾,每次输入完毕后从B中取数据包输出信息
B: 接收udp包,放入接收缓冲区队尾
C: 将发送缓冲区队头报文取出并发送

先测试加锁整个队列时的性能,如果锁的开销过大,尝试使用更细粒度的锁,如锁住每个队列中的元素

不管用什么样的方式,如果报文数量很大,总会有丢包,内核可能会为你丢,甚至硬件可能会为你丢,
试想一下,一个10M能力的网卡,在没有拥塞控制的情况下,接受一个1000M网卡的狠狠发包,能不丢吗,
udp协议本身就不可靠,无法做到一定不丢包或者一定不重复,甚至顺序都无法保证,
如果需要可靠,必须用更可靠的tcp协议,或者通过自己的协议以udp方式实现可靠的传输,
OSI的7层参考模型,每一层都可以加入可靠性传输,在不同的层实现,成本和收货是不同的

总之,高负载情况下,总会有这样那样的因素导致一些惊讶的事情,
良好的设计可以缓解这种压力,但是不可能药到病除

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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