【问题标题】:Winsock and thread safetyWinsock 和线程安全
【发布时间】:2012-02-19 17:35:45
【问题描述】:

我用 C++ 编程已经有一段时间了,但我是网络编程的初学者,我对一些事情还不清楚,所以这是一个由三部分组成的问题。

  1. 在示例应用程序中,我看到在一个套接字上调用 send(),检查其返回值,然后立即在同一个套接字上调用 recv()。但是我觉得这很令人困惑,因为直到在 send() 之后才调用 recv(),所以在调用 recv 之前没有回复消息到达的风险吗?如果是这样,这实际上是一个问题,还是消息会一直处于不确定状态,直到调用 recv 并收到它?

  2. 我希望编写一个与服务器通信的类,它可以向服务器发出几种不同类型的请求,每个请求都有一个函数,它发送请求然后等待回复。我的客户将拥有此类的一个实例作为成员。鉴于 send() 和 recv() 正在阻塞调用,即使我为网络通信创建了一个单独的线程,如何在等待对一个请求的回复时停止所有网络通信?如果一条消息失败,那么直到发送/接收超时,我将无法再发出任何请求,那么每个客户端是否需要多个套接字?不止一个线程?

  3. 我一直在阅读有关线程安全的文章,鉴于 send 和 recv 是阻塞调用,我假设如果每个客户端只有一个线程用于网络通信,我的应用程序将是线程安全的,但是如果我确实需要超过每个客户端一个线程或多个套接字(我还不知道),我将如何使其线程安全?

抱歉,拖了这么久。 谢谢。

【问题讨论】:

    标签: .net multithreading network-programming thread-safety winsock


    【解决方案1】:
    1. 机制没那么简单。客户端、服务器端或两者都可能涉及缓冲区。例如,当消息被复制到缓冲区时,客户端上的发送可能被认为已完成,而不是当它实际通过线路发送时。同样,消息将被复制到服务器端的缓冲区,以便客户端的发送与服务器上的接收相匹配。不用担心这方面。

    2. 我不建议您在同一个套接字上从不同线程执行多次发送。将请求放入队列并让单个线程将它们发送到服务器可能会更好。然后,您可以根据需要在单独的线程上等待回复。

    3. 参见第 2 条。

    【讨论】:

    • 非常感谢都铎王朝。如果我理解正确,那么每个客户端总共有三个线程,主线程实例化网络类并调用函数来发出请求,网络类中的一个线程不断检查消息队列并发送请求,另一个线程什么也不做,只是无休止地调用 recv 并处理结果。我是否需要对消息队列进行某种保护,以便它们不会同时被读取和写入?
    • 是的,您可以使用例如ConcurrentQueue 类,它是一个线程安全的集合。
    • 或者,更有用的是 BlockingCollection。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多