贝贝花花包包店,精品555皮具,钱夹,皮夹

字体:  

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

sokiiya 发表于: 2008-5-20 11:16 来源: ACE 开发者

请教个问题~~~有关ace的锁。
我用的是ACE_Thread_Mutex。
如果目前有多个线程调用acquire()排着队,
我把锁remove()掉,其他线程的acquire()方法都没有往下走,线程似乎挂起了,我需要个remove掉能够返回-1的。
是不是remove用得不合适,又没有让其他排队中的acquite返回错误的方法呢?
请大家指点。

[ 本帖最后由 sokiiya 于 2008-5-20 11:20 编辑 ]

最新回复

sokiiya at 2008-5-20 11:25:38
那个tryacquire()并不排队,只是返回当前是否有人锁着。
okmmno1 at 2008-5-20 11:31:17
remove
最终调用 pthread_mutex_destory,
这个函数里面会调用 pthread_mutex_trylock,
也就是说要先加锁,然后才摧毁锁,

你确定remove成功了么? 检查一下remove的返回值, 不出以外的话
应该是没有成功
okmmno1 at 2008-5-20 11:32:10
错误码应该是 EBUSY
sokiiya at 2008-5-20 11:46:22
remove()返回的是0的。
sokiiya at 2008-5-20 12:41:39

QUOTE:

原帖由 okmmno1 于 2008-5-20 11:31 发表
。。。
也就是说要先加锁,然后才摧毁锁,
。。。
摧毁锁之前加锁用得不是acquire(),而是tryacquire()。tryacquire()返回-1就摧毁锁,我是这样用的,对吗?
sokiiya at 2008-5-20 12:47:39
因为我在做一些释放工作,其优先级最高,别的线程的任务有acquire的排队的,也得被释放工作插队,然后其他那些任务不执行。
okmmno1 at 2008-5-20 13:03:14
tryacquire()返回-1, erron设置为EBUSY, 退出, 不会摧毁锁
okibun0129 at 2008-5-20 13:26:31
建议使用ACE_Gurad_xxx系列类以及相应的宏完成多线程处理锁的问题。
sokiiya at 2008-5-20 13:39:46
我也用了guard_t.h的ACE_Condition<ACE_Thread_Mutex>
锁的时候用宏ACE_GUARD_RETURN(ACE_Thread_Mutex, test, testmutex, -1)。
销毁锁时是使用
        ACE_Guard<ACE_Thread_Mutex> test(testmutex);
        test.remove();
吗???
似乎没有用,其他线程该锁的都锁着 =,=


谢谢~~~

[ 本帖最后由 sokiiya 于 2008-5-20 14:03 编辑 ]
sokiiya at 2008-5-20 14:25:25

QUOTE:

原帖由 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()

着急啊。。。。
okmmno1 at 2008-5-20 16:42:21
你用的windows?
sokiiya at 2008-5-20 16:52:54
阿,,,是的
咋了?

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

}
不用手动释放锁,guard会帮你正确的释放申请的锁。
okmmno1 at 2008-5-21 15:50:51
你可以先把你的程序放在linux上跑一下看看

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

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

可这个时候锁已经不存在了。
sokiiya at 2008-5-26 08:51:33
知道了,ace的锁不是这样用的。
那个remove是摧毁锁,而不是我想要的那种优先级高的功能:让前面列队中的acquire返回错误,放掉列队不往下进行。