::EnterCriticalSection (m);
我定义个 ACE_Map_Manager<ACE_INET_Addr, Client_Handler *, MAP_MUTEX>CONNECTION_MAP;
为什么在插入的时候,老是在
ACE_OS::thread_mutex_lock (ACE_thread_mutex_t *m)
{
// ACE_OS_TRACE ("ACE_OS::thread_mutex_lock");
#if defined (ACE_HAS_THREADS)
# if defined (ACE_HAS_WTHREADS)
::EnterCriticalSection (m);//在这里老是出现异常!
return 0;
# else
return ACE_OS::mutex_lock (m);
# endif /* ACE_HAS_WTHREADS */
#else
ACE_UNUSED_ARG (m);
ACE_NOTSUP_RETURN (-1);
#endif /* ACE_HAS_THREADS */
} 这个取决了你用什么锁,另外就是这个锁对象是否被释放。
这个问题一般可能出现在两方面:
(1)你的数据锁在同步的时候,是否存在线程重入,如果有,你当前使用的锁是否支持线程重入?
(2)你的这个锁对象是否已经被释放,或者被其他线程释放或破坏(比如内存溢出造成的数据写入错误等),如果其他线程释放了这个锁,而此时你的当前线程不知道,就会出现以上问题。
根据这两点去找你的错误。 回复 2# freeeyes
我这个是线程锁 typedef ACE_Thread_Mutex MAP_MUTEX;
我这个在linux下面没有错误,到windows下面就老是出错。 ACE_Thread_Mutex是不可重入锁。在Linux下会有问题。
建议替换成ACE_Recursive_Thread_Mutex再试。 回复 5# freeeyes
我现在是在windows下面应用的,结果这个老出错,我看网上别人有的说ACE::init(),可是我用了也没什么作用。 我也在这句异常过,有一种情况是我忘记对锁对象初始化了
看堆栈m是否有效,可能和你的情况不一样,仅作参考吧 回复 7# adias
我好像也是m这有问题,怎么给这锁初始化? 不一定是这里面的错误。也有可能是其它地方破坏了内存,导致这里出错。 是否你在插入的时候有拷贝,然后别的线程对其又有等待,导致内存错误~~
页:
[1]
2