找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: sokiiya

请教个问题~~~有关ace的锁

[复制链接]
 楼主| 发表于 2008-5-20 14:25:25 | 显示全部楼层
原帖由 okmmno1 于 2008-5-20 13:03 发表
tryacquire()返回-1, erron设置为EBUSY, 退出, 不会摧毁锁


  /**
   * Conditionally acquire lock (i.e., don't wait on queue).  Returns
   * -1 on failure.  If we "failed" because someone else already had
   * the lock, @c errno is set to @c EBUSY.
   */
  int tryacquire (void);

那么不调用tryacquire吗?
直接remove()返回0,但其他线程还是阻塞在acquire()

着急啊。。。。:L
发表于 2008-5-20 16:42:21 | 显示全部楼层
你用的windows?
 楼主| 发表于 2008-5-20 16:52:54 | 显示全部楼层
阿,,,是的
咋了?:)

测试程序是window上试的。但最后做跨平台。
发表于 2008-5-21 15:34:43 | 显示全部楼层
首先,windows下面,不管怎么样,最后remove的返回都是0.
其次,你期望的效果没有办法达到,remove以后,在win下面,
新加的线程如果进行acquire操作将失败, 已经获得过锁,或者阻塞在
acquire的线程不受影响。
发表于 2008-5-21 15:38:52 | 显示全部楼层
确保多个线程均可以访问m_lock,然后把自己需要加锁的代码与ACE_GUARD_RETURN放到一个对大括号内
{
       ACE_GUARD_RETURN(ACE_Thread_Mutex, guard,m_ lock, -1)。
        // 自己的代码

}
不用手动释放锁,guard会帮你正确的释放申请的锁。
发表于 2008-5-21 15:50:51 | 显示全部楼层
你可以先把你的程序放在linux上跑一下看看

其次, 看你刚才程序的逻辑,本身就有问题,

首先用 守卫锁住了锁, 然后摧毁锁, 接着,退出函数的时候, 守卫释放锁,

可这个时候锁已经不存在了。
 楼主| 发表于 2008-5-26 08:51:33 | 显示全部楼层
知道了,ace的锁不是这样用的。
那个remove是摧毁锁,而不是我想要的那种优先级高的功能:让前面列队中的acquire返回错误,放掉列队不往下进行。:L
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 18:12 , Processed in 0.022744 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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