在多线程中使用Socket

3

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

在线程A中调用accept的对象没有关闭。这样安全吗?

在线程A中发生了什么?


这个应该加上一个标签来指示平台(例如Posix),因为套接字和线程都不是标准C++的一部分。套接字可以由线程特定的句柄表示,该句柄不能在其他线程中有效使用。这在SymbianOS中是默认情况。虽然这不是正确的C++,但是在符合C++标准的实现中,没有什么阻止类似BSD风格的套接字实现做同样的事情。 - Steve Jessop
2个回答

4

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


0

是的,它会关闭。但这并不能保证未使用的套接字立即可供垃圾回收(在ThreadA中引用)。

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

  • 套接字对象不是线程安全的,请确保您使用某种锁/互斥来访问此资源(考虑同步)
  • 套接字访问(像任何其他I/O一样)是一个阻塞操作,这可能会在多线程访问的情况下创建大量争用(并浪费大量CPU周期)
  • 始终明确关闭套接字(服务器或客户端),以确保双重确认并避免意外
  • 如果您将持续从套接字读取数据,并且其他线程将消耗此数据,请使用线程安全的数据结构(并发队列)供其他线程消耗。因此,一个线程只需从套接字读取数据并将其提供给队列,其他线程就可以处理数据

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接