为什么会死锁?

u012879806 2014-08-27 11:19:59
{
HANDLE h[2];
h[0] = hAutoResetEvent1; //event 是自动的,初始信号为未触发
h[1] = hAutoResetEvent1; //event 是自动的,初始信号为未触发

waitformutipleobjects(2, h, true, infinite);
}

假设waitformutipleobjects 不是原子操作,

请问在多线程的什么情况下,这代码会导致死锁呢?
提示: waitfor系列函数 会对 自动事件修改状态,如 发现某个事件是触发,会修改为未触发。


...全文
272 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤影品茗 2014-08-28
  • 打赏
  • 举报
回复
这时间
引用 6 楼 u012879806 的回复:
[quote=引用 5 楼 zhaowech 的回复:] 最常见的死锁就是A等着B给信号再发信号给B,B等着A的信号再发信号给A。 想实现死锁,你可以这样做,写2个函数fun1和fun2 fun1() { waitfor(event1); setevent(event2) ; } fun2() { waitfor(event2); setevent(event1); } 这样初始2个都没有触发,永远等不到event1,那么event2就不会触发; event2,不会触发,永远等不到evnet2,那么event1就不会触发; 这样就死循环了,也就是死锁了
你这种太。。。。 基本不可能出现, 原因是: 2个事件都不触发,才会死锁。 可能性太低了。 我感觉 日常所见的 死锁,不是你这种吧。 这太明显低级了 [/quote] 好吧,被鄙视了,在大型程序中,逻辑分支过多,无意识的死锁很容易发生。 使你说,不懂,想举个例子的嘛
u012879806 2014-08-27
  • 打赏
  • 举报
回复
引用 1 楼 u010207727 的回复:
不是原子操作,多线程调用的情况下会死锁。 同时等待资源
可以举例说明吗? 比如,线程1 ,线程2 ,如何到第几步的操作的时候,才会出现死锁。 我想了很久,找不到 “什么情况下会出现死锁“?
kavon_zhang 2014-08-27
  • 打赏
  • 举报
回复
不是原子操作,多线程调用的情况下会死锁。 同时等待资源
u012879806 2014-08-27
  • 打赏
  • 举报
回复
引用 5 楼 zhaowech 的回复:
最常见的死锁就是A等着B给信号再发信号给B,B等着A的信号再发信号给A。 想实现死锁,你可以这样做,写2个函数fun1和fun2 fun1() { waitfor(event1); setevent(event2) ; } fun2() { waitfor(event2); setevent(event1); } 这样初始2个都没有触发,永远等不到event1,那么event2就不会触发; event2,不会触发,永远等不到evnet2,那么event1就不会触发; 这样就死循环了,也就是死锁了
你这种太。。。。 基本不可能出现, 原因是: 2个事件都不触发,才会死锁。 可能性太低了。 我感觉 日常所见的 死锁,不是你这种吧。 这太明显低级了
孤影品茗 2014-08-27
  • 打赏
  • 举报
回复
最常见的死锁就是A等着B给信号再发信号给B,B等着A的信号再发信号给A。 想实现死锁,你可以这样做,写2个函数fun1和fun2 fun1() { waitfor(event1); setevent(event2) ; } fun2() { waitfor(event2); setevent(event1); } 这样初始2个都没有触发,永远等不到event1,那么event2就不会触发; event2,不会触发,永远等不到evnet2,那么event1就不会触发; 这样就死循环了,也就是死锁了
u012879806 2014-08-27
  • 打赏
  • 举报
回复
赵4老师 2014-08-27
  • 打赏
  • 举报
回复
《Windows核心编程》 Synchronization Functions The following functions are used in synchronization. CancelWaitableTimer CreateEvent CreateMutex CreateSemaphore CreateWaitableTimer DeleteCriticalSection EnterCriticalSection GetOverlappedResult InitializeCriticalSection InitializeCriticalSectionAndSpinCount InterlockedCompareExchange InterlockedDecrement InterlockedExchange InterlockedExchangeAdd InterlockedIncrement LeaveCriticalSection MsgWaitForMultipleObjects MsgWaitForMultipleObjectsEx OpenEvent OpenMutex OpenSemaphore OpenWaitableTimer PulseEvent QueueUserAPC ReleaseMutex ReleaseSemaphore ResetEvent SetCriticalSectionSpinCount SetEvent SetWaitableTimer SignalObjectAndWait TimerAPCProc TryEnterCriticalSection WaitForMultipleObjects WaitForMultipleObjectsEx WaitForSingleObject WaitForSingleObjectEx

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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