社区
C++ 语言
帖子详情
linux下多线程同步输出的问题
qshhnkf
2009-12-23 01:34:44
遇到了点问题:多线程网络编程,两个线程,一个线程负责收包(UDP)接收到包后打印出包内信息,另一个线程接受命令行用户输入,然后解析输入,发包。每次用户输入前,我想在命令行输出一个提示符,然后不允许收包线程向控制台输出信息,直到用户完成一次输入。不知道该如何实现。我想过用锁和条件变量控制线程同步,但是主线程等待输入会引起收包线程长时间等待,由于用的UDP,又没有重发机制,感觉这样很容易丢包。
还请诸位朋友帮帮忙,谢谢先!
...全文
205
8
打赏
收藏
linux下多线程同步输出的问题
遇到了点问题:多线程网络编程,两个线程,一个线程负责收包(UDP)接收到包后打印出包内信息,另一个线程接受命令行用户输入,然后解析输入,发包。每次用户输入前,我想在命令行输出一个提示符,然后不允许收包线程向控制台输出信息,直到用户完成一次输入。不知道该如何实现。我想过用锁和条件变量控制线程同步,但是主线程等待输入会引起收包线程长时间等待,由于用的UDP,又没有重发机制,感觉这样很容易丢包。 还请诸位朋友帮帮忙,谢谢先!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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层参考模型,每一层都可以加入可靠性传输,在不同的层实现,成本和收货是不同的
总之,高负载情况下,总会有这样那样的因素导致一些惊讶的事情,
良好的设计可以缓解这种压力,但是不可能药到病除
Window
下多
线程编程、
Linux
下多
线程编程-多线程实验bistu
实验要求说明: Windows: (1)基于CreateThread实现多线程,并实现线程的恢复、暂停、终止等。 (2)基于Beginthread实现多线程,并实现线程的简单同步。 (3)实现多线程字符串查找程序
Linux
: (1)实现多线程字符
输出
,存在三个线程,线程1用来监听用户输入和其他两个线程的监听器,线程2的主要内容为每隔一段时间,
输出
“hello 2”字符串,线程3的主要内容为每隔一段时间,
输出
“hello 3”字符串。 (2)实现多线程字符串排序程序,要求如下: 输入:文件1包含乱序数字0-9,分别利用两个线程进行排序和写入到一个新的文件中
输出
:txt文件格式,例如: 0 1 2 3 4 实验源代码: Windows实验一:基于CreateThread设计实现多线程程序 Windows实验二:基于beginthread设计实现多线程程序 Windows实验三:基于beginthread设计多线程字符串查找程序
Linux
实验一:基于pthread_create设计实现多线程程序
Linux
实验二:基于pthread_create设计实现多线程字符串排序程序
linux
中一个程序的两个线程的同步(c语言实现)
两个线程共享变量a,一个负责加一,一个负责
输出
通过信号灯的pv操作完成
Linux
系统编程第07期:多线程编程入门
Linux
下多
线程编程的概念、API接口使用、
线程同步
的掌握、线程池、协程等基本概念。
操作系统实验三 -
线程同步
在
linux
环境下,利用多线程及同步的方法,编写一个程序模拟火车售票系统,共3个窗口,卖10张票,程序
输出
结果类似(程序
输出
不唯一,可以是其他类似的结果)
linux
-aio:如何使用
Linux
AIO功能
注意,
Linux
AIO现在包含在io_uring API中( , )。 以下说明对旧内核最为有用。 介绍 异步输入/
输出
(AIO)接口允许并行提交许多I / O请求,而每个请求没有线程的开销。 本文档的目的是解释如何使用
Linux
AIO接口,即函数系列io_setup , io_submit , io_getevents , io_destroy 。 当前,AIO接口最适合O_DIRECT访问原始块设备,例如磁盘,闪存驱动器或存储阵列。 什么是AIO? 输入和
输出
功能涉及磁盘或闪存驱动器等设备,其运行速度比CPU慢得多。 因此,CPU可能在等待设备上的操作完成时做其他事情。 有多种方法可以解决此
问题
: 在同步I / O模型中,应用程序从线程发出请求。 线程将阻塞,直到操作完成。 操作系统会产生一种幻象,即向设备发出请求并接收结果,就像在CPU上进行的任何其他操作一样,但实际上,它可
C++ 语言
64,282
社区成员
250,470
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章