2010-05-31 108 views
3

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

线程A中调用accept的对象永远不会关闭。是否安全?

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

+0

这按理说应该有一个标签指示的平台(如POSIX)的数据进行工作,因为无论是插座也不穿是标准C++的一部分。一个套接字可以用一个特定于线程的句柄来表示,它不能在其他线程中有效地使用。 SymbianOS默认情况下是这种情况。哪一个不是合适的C++,但是没有什么可以阻止BSD风格的套接字实现在一些恰当的C++中,从做同样的事情。 – 2010-05-31 15:57:14

回答

4

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

0

是的,它会关闭。但是,这不能确保不使用的插座是立即可进行垃圾回收(ThreadA中参考)

套接字&线程,几个黄金法则...

  • 的Socket对象不踩安全,确保你使用某种锁/互斥体来访问这个资源(想想同步)
  • 套接字访问(像任何其他I/O)是一个阻塞操作,这可以创建很多争用(并浪费一个很多 CPU周期)在多线程访问的情况下
  • 个始终明确关闭套接字(服务器或客户端),只是要双重肯定&没有写成l8r
  • 惊喜自己,如果你不断地去从插座等&线程将消耗该数据读取数据,使用一个线程安全数据结构(并发队列)供其他线程使用。所以一个线程刚刚从套接字读取&数据使得它可在队列中,从那里其他线程可以在