为什么会死锁?

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系列函数 会对 自动事件修改状态,如 发现某个事件是触发,会修改为未触发。


...全文
251 7 打赏 收藏 转发到动态 举报
写回复
用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
  大家好,我是录制课程的老师,课程已经上线课堂,欢迎大家试听,感谢同学们的支持。在你们的学习中我全力助你提升MySQL技能,助你冲击更高年薪。支持课程答疑,支持一对一答疑服务,由课程老师直接回答。    MySQL凭借着它不错的性能、不错的稳定性、数据的安全性常年稳居行业老二宝座。    越来越多的DBA和后端同学在工作中少不了和MySQL打交道,也经常产生这样的疑问:    为什么我写的sql语句性能这么低?  为什么明明我建了索引却没有用到索引?  为什么突然我的数据就成了乱码?  为什么我备份的文件在主库恢复,数据无法同步到从库?  为什么我的数据库数据不多,却占了很多的空间?  生产中我应该选择哪种隔离级别?  生产中都在使用innodb存储引擎,我却对它一无所知?  我应该怎么规划缓冲池才能让数据库性能更高?  为什么我做表数据迁移这么慢?  为什么我写的sql造成那么多的锁冲突、死锁?  为什么我不能将数据恢复到任意时间点?  为什么我不能解决公司主从复制架构中的故障?  吧啦吧啦一大堆问题……    在面试中MySQL的一些知识更成为躲不过的问题,比如b+tree索引、MVCC、隔离级别的实现、锁的使用,主从复制,MySQL性能优化、事务两阶段提交等等都成为了面试考题重灾区。    我的课程就是从实际工作来,从问题出发,带着问题来学习MySQL,想解决问题就要学习新的知识,大家跟紧老司机,MySQL的面纱就慢慢摘下。

69,371

社区成员

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

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