【发布时间】:2009-10-06 06:32:06
【问题描述】:
我正在尝试在不同的线程中处理套接字,从而导致运行时失败。请参阅以下代码。
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() 时,它会给出一个异常。
我搜索了这个错误并找到了一些原因。 发生这种情况是因为; CSocket 对象应仅在单个线程的上下文中使用,因为由 CAsyncSocket 对象封装的 SOCKET 句柄存储在每个线程句柄映射中。他们还通过在线程之间共享 SOCKET 句柄来提出解决方案 (http://support.microsoft.com/kb/175668)。但这在我的情况下是不可能的,因为我排除了一些不适用于上述解决方案的通知回调。任何人都可以建议一种机制来在线程之间共享 CSocket 而不会影响通知回调?
【问题讨论】:
-
顺便说一句,在多线程环境中使用 ++ 和 -- 将不起作用,因为这些操作不能保证是原子的。您可以使用 InterlockedIncrement() 和 InterlockedDecrement() 来实现原子性。与您面临的问题无关,但请记住。
标签: c++ multithreading exception sockets