在多线程WaitForSingleObject () 与互斥量时,等时间超时的疑问

asdjy123 2014-08-19 03:59:31
如:其中g_hEventMutex=CreateMutex(NULL,FALSE,"EventMutex")
假如此时线程A正占有互斥量,下面的程序为线程B的程序
//线程B
WaitForSingleObject(g_hEventMutex,5000);
。。。运行代码B
ReleaseMutex(g_hEventMutex); //释放互斥量

在超过5000ms之后g_hEventMutex还是为无信号状态,这时WaitForSingleObject()返回WAIT_TIMEOUT,
在MSDN的解析中看到,返回值:WAIT_TIMEOUT:The time-out interval elapsed, and the object's state is nonsignaled,这是否意味着在线程A中占有的互斥量(g_hEventMutex)直接被系统强制解除了,给线程B的运行代码B运行了?
...全文
322 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lx624909677 2014-08-19
  • 打赏
  • 举报
回复
引用 4 楼 asdjy123 的回复:
公司的程序中好多地方这么使用的,我就是想知道如果时间超时了,A线程还霸占资源,那么线程B在运行WaitForSingleObject()之后是什么情况,还是一直在等待直到A释放资源之后才进行运行“运行代码B”吗? [quote=引用 1 楼 Saleayas 的回复:] 是说,返回 TiMEOUT 的时候,表示时间到了,同时还没有信号。 也就说,时间到了,线程 A 还是霸住了这个资源没有释放。
引用 2 楼 lx624909677 的回复:
超时不代表线程资源的释放,只是说,等待无果而已
引用 3 楼 happyparrot 的回复:
应该不是这样的,这是一种异常状态,你设置这个超时时间,原则上你得到这个超时信息后,应该进行特殊处理。比如超过5秒还没等到,就强行运行,或者直接退出,或者进行提示后继续等待等等。 就好比等车,如果10分钟不来,你可能有预案,比如干脆步行去目的地,或者不去了,直接回家等。但绝对不可能你等10分钟还没等到时,这公交车就自动能抢过来的。 这只是一个事件,你可以根据需要进行例外处理
[/quote] 查看下WaitForSingleObject最后一个参数你就明白了
asdjy123 2014-08-19
  • 打赏
  • 举报
回复
谢谢各位的及时回答:解决了疑问。
Saleayas 2014-08-19
  • 打赏
  • 举报
回复
这就是你自己要处理的逻辑了。 比如这个资源是打印机。 那么在等待了比如 1分钟之后,打印机还在被其他作业打印中, 此时怎么办是你要处理的。 可以直接取消,可以弹出一个对话框,问用户是否取消,还是继续等待,?? switch(WaitForSingleObject(...)) { case WAIT_OBJECT_0: // Print. case WAIT_TIMEOUT: // Query user; default: return FALSE; }
oyljerry 2014-08-19
  • 打赏
  • 举报
回复
引用 4 楼 asdjy123 的回复:
公司的程序中好多地方这么使用的,我就是想知道如果时间超时了,A线程还霸占资源,那么线程B在运行WaitForSingleObject()之后是什么情况,还是一直在等待直到A释放资源之后才进行运行“运行代码B”吗? [quote=引用 1 楼 Saleayas 的回复:] 是说,返回 TiMEOUT 的时候,表示时间到了,同时还没有信号。 也就说,时间到了,线程 A 还是霸住了这个资源没有释放。
引用 2 楼 lx624909677 的回复:
超时不代表线程资源的释放,只是说,等待无果而已
引用 3 楼 happyparrot 的回复:
应该不是这样的,这是一种异常状态,你设置这个超时时间,原则上你得到这个超时信息后,应该进行特殊处理。比如超过5秒还没等到,就强行运行,或者直接退出,或者进行提示后继续等待等等。 就好比等车,如果10分钟不来,你可能有预案,比如干脆步行去目的地,或者不去了,直接回家等。但绝对不可能你等10分钟还没等到时,这公交车就自动能抢过来的。 这只是一个事件,你可以根据需要进行例外处理
[/quote] B超时后,就表示不会继续等待被A所占用的资源,B开始执行它的工作,不管A是否所占用mutex
asdjy123 2014-08-19
  • 打赏
  • 举报
回复
公司的程序中好多地方这么使用的,我就是想知道如果时间超时了,A线程还霸占资源,那么线程B在运行WaitForSingleObject()之后是什么情况,还是一直在等待直到A释放资源之后才进行运行“运行代码B”吗?
引用 1 楼 Saleayas 的回复:
是说,返回 TiMEOUT 的时候,表示时间到了,同时还没有信号。 也就说,时间到了,线程 A 还是霸住了这个资源没有释放。
引用 2 楼 lx624909677 的回复:
超时不代表线程资源的释放,只是说,等待无果而已
引用 3 楼 happyparrot 的回复:
应该不是这样的,这是一种异常状态,你设置这个超时时间,原则上你得到这个超时信息后,应该进行特殊处理。比如超过5秒还没等到,就强行运行,或者直接退出,或者进行提示后继续等待等等。 就好比等车,如果10分钟不来,你可能有预案,比如干脆步行去目的地,或者不去了,直接回家等。但绝对不可能你等10分钟还没等到时,这公交车就自动能抢过来的。 这只是一个事件,你可以根据需要进行例外处理
快乐鹦鹉 2014-08-19
  • 打赏
  • 举报
回复
应该不是这样的,这是一种异常状态,你设置这个超时时间,原则上你得到这个超时信息后,应该进行特殊处理。比如超过5秒还没等到,就强行运行,或者直接退出,或者进行提示后继续等待等等。
就好比等车,如果10分钟不来,你可能有预案,比如干脆步行去目的地,或者不去了,直接回家等。但绝对不可能你等10分钟还没等到时,这公交车就自动能抢过来的。

这只是一个事件,你可以根据需要进行例外处理
lx624909677 2014-08-19
  • 打赏
  • 举报
回复
超时不代表线程资源的释放,只是说,等待无果而已
Saleayas 2014-08-19
  • 打赏
  • 举报
回复
是说,返回 TiMEOUT 的时候,表示时间到了,同时还没有信号。 也就说,时间到了,线程 A 还是霸住了这个资源没有释放。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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