Para mí ahora parece que funcionalmente Semaphore.WaitOne/Release
es igual a Monitor.Wait/Pulse
. Saltarse las capacidades de interproceso, la velocidad (sí, se gestiona el monitor) otras diferencias no funcionales, ¿cuál es la diferencia real entonces?Semaphore.WaitOne/Release vs Monitor.Pulse/Wait
Respuesta
El objetivo principal de Semaphore
es controlar el acceso a un conjunto finito de recursos. El hilo puede participar en la adquisición de recursos llamando al WaitOne
y Release
. Un thead debe llamar al WaitOne
para adquirir el recurso. Sin embargo, solo se bloqueará si el conteo del semáforo llega a 0, de lo contrario, el hilo es libre de adquirirlo inmediatamente. Una vez que el hilo ha terminado, debe llamar al Release
para indicarle al semáforo que se ha liberado un espacio adicional para otro hilo.
Monitor.Wait
y Monitor.Pulse
son drásticamente diferentes. Lo primero y más importante es que no hay conteo involucrado. Si se llama al Pulse
en ausencia de cualquier llamada al Wait
, la señal se ignora y se descarta. No está en cola de la misma manera que lo haría un semáforo. De hecho, el comportamiento de Wait
y Pulse
no tiene ningún significado inherente. El Wait
simplemente está esperando un cambio en el estado del bloqueo adquirido (adquirido en Monitor.Enter
). El Pulse
es la señal de que algo cambió. Es por eso que a menudo se ve Wait
llamado en un bucle while
. El hilo de espera debe volver a probar la condición de espera porque no tiene idea de qué cambió.
Monitor.Wait
y Monitor.Pulse
son mecanismos de sincronización fundamentales que se pueden utilizar para formar prácticamente cualquier otro dispositivo de sincronización, incluidos semáforos.
Monitor.Wait/Pulse le proporciona una variable de condición, que es más como un evento de reinicio automático que un semáforo (pero no exactamente). La principal diferencia es que un semáforo tiene un recuento, lo que significa que no necesita bloquear nada para asegurarse de no perder un pulso (a diferencia de Monitor.Wait).
- 1. J2ME VS Android VS iPhone VS Symbian VS Windows CE
- 2. TagSoup vs Jsoup vs HTML Analizador vs vs HotSax
- 3. 'método' vs. 'mensaje' vs. 'función' vs. '???'
- 4. ACE vs Boost vs Poco vs wxWidgets
- 5. VS 2008 vs VS 2008 Express
- 6. Atomikos vs JOTM vs Bitronix vs?
- 7. Acumular vs fold vs reducir vs compress
- 8. .NET vs ASP.NET vs CLR vs ASP
- 9. control.BeginInvoke() Vs Dispatcher Vs SynchronizationContext Vs .. - FIABILIDAD
- 10. método vs función vs procedimiento vs clase?
- 11. Rhino simulacro vs Typemock vs JustMock vs
- 12. inline vs __inline vs __inline__ vs __forceinline?
- 13. Exec vs vs ExecWait ExecShell vs nsExec :: Exec vs nsExec :: ExecToLog vs nsExec :: ExecToStack vs vs ExecDos ExeCmd
- 14. bigtable vs cassandra vs simpledb vs dynamo vs couchdb vs hypertable vs riak vs hbase, ¿qué tienen en común?
- 15. Crystalspace vs. Irrlicht vs. .....?
- 16. NetSqlAzMan vs AzMan vs (?????)
- 17. SpiderMonkey vs JavaScriptCore vs.
- 18. Django -vs- Grails -vs-?
- 19. Stackpanel: Altura vs ActualHeight vs ExtentHeight vs ViewportHeight vs DesiredSize vs RenderSize
- 20. Mathematica: sin evaluar vs vs Defer Hold vs vs HoldForm HoldAllComplete vs etc, etc
- 21. NSImage vs. CIImage vs. CGImage?
- 22. Bitmap vs ImageView vs Drawable
- 23. DIP vs. DI vs. IoC
- 24. Boo vs C# vs Python?
- 25. DbConnection vs OleDbConnection vs OdbcConnection
- 26. MySQL vs Firebird vs SQLite
- 27. JSF Facelets vs vs JSP
- 28. migrator.net vs fluentmigrator vs migsharp
- 29. Matlab vs Aforge vs OpenCV
- 30. flume vs kafka vs others
¡esta es una respuesta increíble! ¡Me quitó las cosas! – Andrey
A menudo es mejor considerar 'Pulse' como una señal de que algo" puede haber "cambiado. La idea esencial es que si un método necesita esperar a que un recurso cambie de alguna manera (por ejemplo, una cola para tener datos en él), y ese cambio solo se puede realizar mediante un código que mantenga el bloqueo de ese recurso, el método anterior puede probar si el cambio ha sucedido y, si no, llamar 'Monitor.Wait' en el bloqueo. Si cada método que cambia los recursos bloqueados llama 'PulseAll', cualquiera que esté esperando un cambio se despertará y tendrá la oportunidad de ver si el cambio que estaban esperando ocurrió. – supercat