sokiiya 发表于 2008-5-20 14:25:25

原帖由 okmmno1 于 2008-5-20 13:03 发表 http://www.acejoy.com/bbs/images/common/back.gif
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

okmmno1 发表于 2008-5-20 16:42:21

你用的windows?

sokiiya 发表于 2008-5-20 16:52:54

阿,,,是的
咋了?:)

测试程序是window上试的。但最后做跨平台。

okmmno1 发表于 2008-5-21 15:34:43

首先,windows下面,不管怎么样,最后remove的返回都是0.
其次,你期望的效果没有办法达到,remove以后,在win下面,
新加的线程如果进行acquire操作将失败, 已经获得过锁,或者阻塞在
acquire的线程不受影响。

okibun0129 发表于 2008-5-21 15:38:52

确保多个线程均可以访问m_lock,然后把自己需要加锁的代码与ACE_GUARD_RETURN放到一个对大括号内
{
       ACE_GUARD_RETURN(ACE_Thread_Mutex, guard,m_ lock, -1)。
      // 自己的代码

}
不用手动释放锁,guard会帮你正确的释放申请的锁。

okmmno1 发表于 2008-5-21 15:50:51

你可以先把你的程序放在linux上跑一下看看

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

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

可这个时候锁已经不存在了。

sokiiya 发表于 2008-5-26 08:51:33

知道了,ace的锁不是这样用的。
那个remove是摧毁锁,而不是我想要的那种优先级高的功能:让前面列队中的acquire返回错误,放掉列队不往下进行。:L
页: 1 [2]
查看完整版本: 请教个问题~~~有关ace的锁