您的位置:ACE 开发者 >> 论坛 >> ACE基础应用 >> 查看帖子
字体: 小 中 大
sokiiya 发表于: 2008-5-20 11:16 来源: ACE 开发者
QUOTE:
原帖由 okmmno1 于 2008-5-20 11:31 发表 。。。 也就是说要先加锁,然后才摧毁锁, 。。。
原帖由 okmmno1 于 2008-5-20 13:03 发表 tryacquire()返回-1, erron设置为EBUSY, 退出, 不会摧毁锁
最新回复
最终调用 pthread_mutex_destory,
这个函数里面会调用 pthread_mutex_trylock,
也就是说要先加锁,然后才摧毁锁,
你确定remove成功了么? 检查一下remove的返回值, 不出以外的话
应该是没有成功
QUOTE:
摧毁锁之前加锁用得不是acquire(),而是tryacquire()。tryacquire()返回-1就摧毁锁,我是这样用的,对吗?锁的时候用宏ACE_GUARD_RETURN(ACE_Thread_Mutex, test, testmutex, -1)。
销毁锁时是使用
ACE_Guard<ACE_Thread_Mutex> test(testmutex);
test.remove();
吗???
似乎没有用,其他线程该锁的都锁着 =,=
谢谢~~~
[ 本帖最后由 sokiiya 于 2008-5-20 14:03 编辑 ]
QUOTE:
/*** 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()
着急啊。。。。
咋了?
测试程序是window上试的。但最后做跨平台。
其次,你期望的效果没有办法达到,remove以后,在win下面,
新加的线程如果进行acquire操作将失败, 已经获得过锁,或者阻塞在
acquire的线程不受影响。
{
ACE_GUARD_RETURN(ACE_Thread_Mutex, guard,m_ lock, -1)。
// 自己的代码
}
不用手动释放锁,guard会帮你正确的释放申请的锁。
其次, 看你刚才程序的逻辑,本身就有问题,
首先用 守卫锁住了锁, 然后摧毁锁, 接着,退出函数的时候, 守卫释放锁,
可这个时候锁已经不存在了。
那个remove是摧毁锁,而不是我想要的那种优先级高的功能:让前面列队中的acquire返回错误,放掉列队不往下进行。