我正試圖在不同的線程中處理套接字,從而導致運行時失敗。請參閱以下代碼。如何在不同的線程中處理相同的套接字?
void MySocket::Lock()
{
m_LockCount++;
if(m_LockCount)
{
CSocket::Create(8080);
}
}
void MySocket::Unlock()
{
m_LockCount--;
if(!m_LockCount)
{
CSocket::Close();
}
}
我從一個線程調用Lock()並從另一個線程調用Unlock()。當它執行CSocket :: Close()時,它會發出異常。
我搜索了這個bug並得到了一些原因。 發生這種情況是因爲;一個CSocket對象只能在單個線程的上下文中使用,因爲由CAsyncSocket對象封裝的SOCKET句柄存儲在每個線程句柄映射中。他們還通過在線程之間共享SOCKET句柄來建議解決方案(http://support.microsoft.com/kb/175668)。但在我的情況下,這是不可能的,因爲我除了一些通知回調,這將無法與上述解決方案。任何人都可以建議一種機制來在線程之間共享CSocket而不影響通知回調?
順便說一句,使用++和類似的多線程環境中將不會工作,因爲這些操作不保證是原子的。您可以使用InterlockedIncrement()和InterlockedDecrement()來實現原子性。與您面臨的問題無關,但請記住。 – Naveen 2009-10-06 06:48:48
@Naveen - 感謝提示 – Vadakkumpadath 2009-10-06 10:37:19