【问题标题】:Socket in multiple threads多线程中的套接字
【发布时间】:2010-05-31 23:32:54
【问题描述】:

我有一个项目,线程 A 在某个套接字上调用 Accept(...),然后将其传递给另一个线程,该线程在套接字上接收,然后关闭套接字。

调用accept的对象在线程A中永远不会关闭。这样安全吗?

线程 A 中的那个对象会发生什么?

【问题讨论】:

  • 这可以说应该有一个指示平台的标签(例如 Posix),因为套接字和线程都不是标准 C++ 的一部分。一个套接字可以由一个线程特定的句柄表示,它不能在其他线程中有效地使用。 SymbianOS 默认情况下就是这种情况。这不是正确的 C++,但是没有什么可以阻止 BSD 样式的套接字实现在正确的 C++ 中做同样的事情。

标签: c++ sockets multithreading


【解决方案1】:

套接字不是一个对象——它只是一个数字(或者可以想象是一个指针)。如果您将整数从一个线程传递到另一个线程,则没有问题 - 与套接字相同。这假设您询问的是操作系统级别的套接字,而不是您或您正在使用的框架已经实现的某个套接字类,并且您只能从其中一个线程访问套接字,这似乎是这种情况。

【讨论】:

    【解决方案2】:

    是的,它会关闭。但这并不能保证未使用的套接字立即可用于垃圾收集(参考 ThreadA)

    套接字和线程,一些黄金法则...

    • Socket 对象并不安全,请确保您使用某种锁/互斥锁来访问此资源(考虑同步)
    • 套接字访问(与任何其他 I/O 一样)是一种阻塞操作,在多线程访问的情况下,这会产生大量争用(并浪费 大量 CPU 周期)李>
    • 总是明确关闭套接字(服务器或客户端),只是为了确保双倍确定,不要让自己感到惊讶 l8r
    • 如果您要不断地从套接字读取数据而其他线程将使用这些数据,请使用线程安全数据结构(并发队列)供其他线程使用。所以一个线程只是从套接字读取数据并使其在队列中可用,其他线程可以从那里处理数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2011-02-11
      • 2020-03-28
      • 2016-07-23
      • 1970-01-01
      • 2014-03-14
      相关资源
      最近更新 更多