kcr*_*ris 2 c++ sockets qt multithreading
BSD流套接字是全双工的,这意味着两个连接方可以同时发送/接收.
QTcpSocket(qt套接字实现)具有异步支持,非阻塞模式,但只能属于一个线程,请参阅qt docs.
事件驱动的对象只能在单个线程中使用.具体而言,这适用于计时器机制和网络模块.
假设我想要一个transmit/tx线程和一个单独的receive/rx线程来使用相同的套接字并同时发送/接收数据.
根据我的理解,这可以通过qt信号/插槽"完成",但套接字线程永远不会真正同时执行send()和receive().它只运行事件循环,它将以串行方式执行此操作,并在发送/接收完成时发出信号.
是的,我的rx和tx线程可以同时工作并通过qt插槽处理通知,但套接字本身从未真正用于全双工模式.
这样说是正确的:只考虑一个端点,在套接字线程中,它的send()和receive()调用总是串行的,永远不会同时发生?(因为事件循环线程只是一个线程)
根据我的理解,这可以通过qt信号/插槽"完成",但套接字线程永远不会真正同时执行send()和receive().它只运行事件循环,它将以串行方式执行此操作,并在发送/接收完成时发出信号.
是的,但请记住,内核缓冲传入和传出数据,QTCPSocket将套接字设置为非阻塞,因此send()和recv()调用始终立即返回,并且永远不会阻塞事件循环.这意味着发送和接收数据的实际过程将同时发生(在内核内),即使(或多或少的瞬时)send()和recv()技术上没有.(*)
是的,我的rx和tx线程可以同时工作并通过qt插槽处理通知,但套接字本身从未真正用于全双工模式.它是否正确?
这是不正确的 - 套接字的数据流可以(并且确实)同时在网络上双向流动,因此套接字实际上是全双工的.无论您使用的是单线程还是多线程,都可以使用全双工功能.
(*)您可以使用单线程Qt程序对此进行测试,该程序使用QTCPSocket发送或接收数据,只需在大型数据传输期间断开计算机的以太网电缆即可.如果QTCPSocket的send()或recv()调用阻塞直到完成,那将阻止GUI线程并导致GUI无响应,直到您重新连接电缆(或直到TCP连接在几分钟后超时).
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |