找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 14956|回复: 12

::EnterCriticalSection (m);

  [复制链接]
发表于 2011-5-5 10:12:31 | 显示全部楼层 |阅读模式
我定义个 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 */
}
发表于 2011-5-5 10:50:17 | 显示全部楼层
这个取决了你用什么锁,另外就是这个锁对象是否被释放。
这个问题一般可能出现在两方面:
(1)你的数据锁在同步的时候,是否存在线程重入,如果有,你当前使用的锁是否支持线程重入?
(2)你的这个锁对象是否已经被释放,或者被其他线程释放或破坏(比如内存溢出造成的数据写入错误等),如果其他线程释放了这个锁,而此时你的当前线程不知道,就会出现以上问题。
根据这两点去找你的错误。
 楼主| 发表于 2011-5-5 11:10:33 | 显示全部楼层
回复 2# freeeyes


    我这个是线程锁
 楼主| 发表于 2011-5-5 11:11:31 | 显示全部楼层
typedef ACE_Thread_Mutex MAP_MUTEX;
我这个在linux下面没有错误,到windows下面就老是出错。
发表于 2011-5-5 12:10:56 | 显示全部楼层
ACE_Thread_Mutex是不可重入锁。在Linux下会有问题。
建议替换成ACE_Recursive_Thread_Mutex再试。
 楼主| 发表于 2011-5-5 15:36:01 | 显示全部楼层
回复 5# freeeyes


    我现在是在windows下面应用的,结果这个老出错,我看网上别人有的说ACE::init(),可是我用了也没什么作用。
发表于 2011-5-6 14:19:38 | 显示全部楼层
我也在这句异常过,有一种情况是我忘记对锁对象初始化了
看堆栈m是否有效,可能和你的情况不一样,仅作参考吧
 楼主| 发表于 2011-5-6 15:25:53 | 显示全部楼层
回复 7# adias


    我好像也是m这有问题,怎么给这锁初始化?
发表于 2011-5-6 20:40:53 | 显示全部楼层
不一定是这里面的错误。也有可能是其它地方破坏了内存,导致这里出错。
发表于 2011-5-9 23:06:18 | 显示全部楼层
是否你在插入的时候有拷贝,然后别的线程对其又有等待,导致内存错误~~
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 16:40 , Processed in 0.023628 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表