多线程套接字

时间:2010-05-31 15:15:33

标签: c++ sockets multithreading

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

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

线程A中该对象会发生什么?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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

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