【发布时间】:2015-03-15 06:37:39
【问题描述】:
BSD 流套接字是全双工的,这意味着两个连接方可以同时发送/接收。
一个QTcpSocket(qt socket实现)支持异步,非阻塞模式,但只能属于一个线程,见qt docs。
事件驱动对象只能在单个线程中使用。 具体来说,这适用于定时器机制和网络 模块。
假设我想要一个传输/发送线程和一个单独的接收/接收线程来使用同一个套接字并同时发送/接收数据。
据我了解,这可以通过 qt 信号/插槽“完成”,但套接字线程永远不会真正同时执行 send() 和 receive()。它只是运行事件循环,它将以串行方式执行此操作,并在发送/接收完成时发出信号。
是的,我的 rx 和 tx 线程可以同时工作并通过 qt 插槽处理通知,但套接字本身从未真正用于全双工模式。
这样说是否正确:仅考虑一个端点,在套接字线程中,它的 send() 和 receive() 调用总是串行的,从不同时的? (因为事件循环线程只有一个线程)
【问题讨论】:
-
“假设我想要一个 tx 线程和一个单独的 rx 线程来使用同一个套接字并同时发送/接收数据。”不,不能这样做。给定套接字上的所有操作必须在同一个线程中执行。如果您尝试您提出的建议,它将使几个 Qt 调试断言失败。此外,要将套接字放在与
QTcpServer不同的线程中,您需要对其进行子类化并做一些小技巧。 -
在我的示例中有三个线程:socket 线程、rx 线程和 tx 线程。 Socket 线程运行事件循环,并且是唯一执行实际 send()/receive() 的线程。 Rx 和 Tx 线程只是通过信号/插槽或事件来操作套接字。这是 100% 可能的。我的问题是关于套接字线程中真正发生的事情,事件循环实际上是在序列化套接字调用。
标签: c++ multithreading qt sockets