同一线程内多次WaitForSingleObject同一个mutex的问题

随风来去 2009-09-15 10:13:51
某线程代码在同一个线程内执行了两次wait mutex,是否会有问题?

thread1::run()
{

while(1)
{
WaitForSingleObject(a_mtx, INFINITE)

functionA();

ReleaseMutex(a_mtx);
}
}


functionA()
{
WaitForSingleObject(a_mtx, INFINITE)

do_something();

ReleaseMutex(a_mtx);


}


...全文
712 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
flymoon99 2009-09-25
  • 打赏
  • 举报
回复
不过你对同一个对象释放了2次- -!这样是不对滴
flymoon99 2009-09-25
  • 打赏
  • 举报
回复
没问题,但是似乎没这个必要吧- -!!画蛇添足了
on_2008 2009-09-25
  • 打赏
  • 举报
回复
在 Windows 中,象上面的例子中在同一线程中使用 WaitForSingleObject 是可以工作的,不会锁住。
在 Linux 中,使用 pthread_mutex_lock 则会锁住.
随风来去 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fxworld 的回复:]
引用 5 楼 dynku 的回复:

funcA 再次等待a_mtx是因为这个函数是个工具函数,不止这一处调用,所以函数内部对list进行了保护
而线程主函数因为也操作了List ,所以也使用了等待a_mtx 这样就形成了嵌套等待的问题
从实际使用看是可以正常操作的,但是网上查资料基本上没有提到这个问题,所以比较迷惑


  你在标题里说的是在同一个线程里执行,所以只能按你标题里说的去猜测。

  不过用同一个 a_mtx 嵌套等待会不会有问题,个人觉得好像不太好。
[/Quote]

虽然在两个函数中,但是因为是串行执行,确实是一个线程
如果展开了就是

wait1
OP1
wait2
OP2
release2
release1

不过由于wait2-OP2-release2 在多处需要使用,所以独立成一个函数

这种用法目前还没出现问题,但是总觉得需要有个权威一点的解释,不知道谁能提供
fieldisme 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dynku 的回复:]
funcA 再次等待a_mtx是因为这个函数是个工具函数,不止这一处调用,所以函数内部对list进行了保护
而线程主函数因为也操作了List ,所以也使用了等待a_mtx 这样就形成了嵌套等待的问题
从实际使用看是可以正常操作的,但是网上查资料基本上没有提到这个问题,所以比较迷惑
[/Quote]
这说明你的数据设计有问题吧,公用函数体内操作List,线程主函数操作List,其它线程也操作List。不过这样是可以的,只是第二次wait直接就返回了,如果wait了两次,就要Release两次,你的代码实际是不会出问题的
随风来去 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fxworld 的回复:]
  除非在你的FuncA()又生成一个线程,否则 while 循环和funcA都是在同一个线程里执行,这时应该不需要 a_mtx ,因为在同一个线程里执行的代码是同步的,不会出现同时访问List的情况。


  如果在你的FuncA()又生成一个线程,这时才应该同步对List的访问,不过如果要用 a_mtx 同步的话,不建议多个线程同时等待同一个内核对象(据《windows核心编程》里说有可能造成死锁),最好是用两个互斥对象,等待函数使用 SignalObjectAndWait。

  多个线程同步对List的访问,速度比较快的应该是使用临界变量(CRITICALSECTION)。或者使用像
InterlockedExchange这样的函数。



[/Quote]

funcA 再次等待a_mtx是因为这个函数是个工具函数,不止这一处调用,所以函数内部对list进行了保护
而线程主函数因为也操作了List ,所以也使用了等待a_mtx 这样就形成了嵌套等待的问题
从实际使用看是可以正常操作的,但是网上查资料基本上没有提到这个问题,所以比较迷惑
kouwenlong 2009-09-16
  • 打赏
  • 举报
回复
学习线程.
Greg_han 2009-09-16
  • 打赏
  • 举报
回复
线程主函数是

for(list)
{
检查List内容
如达到条件,调用funcA()
}

funcA()中同样的操作了List,如List.push_back 啥的

所以针对List 有个 a_mtx的互斥量保护

实际应用中,这样双重锁好象并不会死锁
fxworld 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dynku 的回复:]

funcA 再次等待a_mtx是因为这个函数是个工具函数,不止这一处调用,所以函数内部对list进行了保护
而线程主函数因为也操作了List ,所以也使用了等待a_mtx 这样就形成了嵌套等待的问题
从实际使用看是可以正常操作的,但是网上查资料基本上没有提到这个问题,所以比较迷惑
[/Quote]

你在标题里说的是在同一个线程里执行,所以只能按你标题里说的去猜测。

不过用同一个 a_mtx 嵌套等待会不会有问题,个人觉得好像不太好。
fxworld 2009-09-15
  • 打赏
  • 举报
回复
不知道这样做的理由是什么,感觉没有必要,functionA()里已经有 Wait..... ,

在 While循环里的 Wait..... 完全可以不要了。
fxworld 2009-09-15
  • 打赏
  • 举报
回复

除非在你的FuncA()又生成一个线程,否则 while 循环和funcA都是在同一个线程里执行,这时应该不需要 a_mtx ,因为在同一个线程里执行的代码是同步的,不会出现同时访问List的情况。


如果在你的FuncA()又生成一个线程,这时才应该同步对List的访问,不过如果要用 a_mtx 同步的话,不建议多个线程同时等待同一个内核对象(据《windows核心编程》里说有可能造成死锁),最好是用两个互斥对象,等待函数使用 SignalObjectAndWait。

多个线程同步对List的访问,速度比较快的应该是使用临界变量(CRITICALSECTION)。或者使用像
InterlockedExchange这样的函数。



随风来去 2009-09-15
  • 打赏
  • 举报
回复
主要是中间用到一个List

线程主函数是

for(list)
{
检查List内容
如达到条件,调用funcA()
}

funcA()中同样的操作了List,如List.push_back 啥的

所以针对List 有个 a_mtx的互斥量保护

实际应用中,这样双重锁好象并不会死锁
会顺利执行
但是按 songhtao 说的,则应该在funcA内一直等待了
我不懂电脑 2009-09-15
  • 打赏
  • 举报
回复
WaitForSingleObject每检查一次自动事件对象就将其重置
如果是自动事件的话第一个WaitForSingleObject检测到后,第二个WaitForSingleObject就检测不到了。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧