2010-05-31 147 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
  • 驚喜自己,如果你不斷地去從插座等&線程將消耗該數據讀取數據,使用一個線程安全數據結構(併發隊列)供其他線程使用。所以一個線程剛剛從套接字讀取&數據使得它可在隊列中,從那裏其他線程可以在