【发布时间】:2021-12-23 13:24:13
【问题描述】:
要调用Monitor.Wait(obj) 或Monitor.Pulse(obj),首先必须通过lock(obj) 或Monitor.Enter(obj) 进入监视器。为什么 API 需要这个?
Thread synchronization: Wait and Pulse demystified 暗示了一些关于条件变量等的东西,但我不明白为什么我希望始终使用它。
我的意思是,如果只是实现依赖于获取的锁来完成Wait 或Pulse 的工作,为什么不只是在内部实现它作为它们的一部分呢?为什么不将Wait 和Pulse 与Monitor 中的其他行为完全解耦,让开发人员随心所欲地使用这些功能?这对开发人员来说似乎是一个毫无意义的负担,但有充分的理由让它成为这样吗?
更具体地说,Monitor.Wait(obj) throws SynchronizationLockException 如果“Wait 不是从同步代码块中调用”。 Monitor.Pulse(obj) throws SynchronizationLockException 如果“调用线程不拥有指定对象的锁”。
【问题讨论】:
-
您是在问“为什么
lock是使用Monitor类实现的,而不是相反”或“为什么要使用Wait/Pulse释放锁需要获取先用lock或Enter锁定?”或者你问更多关于为什么像stackoverflow.com/questions/1559293/…这样的存在? -
抱歉,我已经编辑了原始问题以使其更清晰。
-
不,您的编辑并没有使问题更清楚-您的意思已经很清楚了(例如,每个人都可以查看文档以查看使用模式),但仍不清楚您为什么这么认为对于“作为单个操作获取和释放锁”将具有一定的价值。如果你能解释一下你希望
Wait做什么,那就太好了,这样人们就可以尝试澄清这一点。 (旁注你显然知道"EDIT:" should not be added 要发布 - 除非你有一些特别的声明,否则避免这样做) -
@Jake1234 有点不清楚。随意编辑整个内容,或者关闭它并写一个新问题
标签: c# multithreading