Me pregunto si hay un aumento equivalente a ManualResetEvent? Básicamente, me gustaría una implementación multiplataforma ... O, ¿podría alguien ayudarme a imitar la funcionalidad de ManualResetEvent usando Boost :: thread? Gracias chicosAumentar el equivalente de ManualResetEvent?
Respuesta
Es bastante fácil escribir un evento de reinicio manual cuando tiene mutexes y variables de condición.
Lo que necesitará es un campo que representa si su evento de reinicio está señalizado o no. El acceso al campo deberá estar protegido por un mutex; esto incluye tanto configurar/restablecer el evento como verificar si está señalizado.
Cuando está esperando su evento, si no está señalizado actualmente, querrá esperar una variable de condición hasta que se señalice. Finalmente, en su código que establece el evento, querrá notificar a la variable de condición para despertar a cualquiera que esté esperando su evento.
class manual_reset_event
{
public:
manual_reset_event(bool signaled = false)
: signaled_(signaled)
{
}
void set()
{
{
boost::lock_guard<boost::mutex> lock(m_);
signaled_ = true;
}
// Notify all because until the event is manually
// reset, all waiters should be able to see event signalling
cv_.notify_all();
}
void unset()
{
boost::lock_guard<boost::mutex> lock(m_);
signaled_ = false;
}
void wait()
{
boost::lock_guard<boost::mutex> lock(m_);
while (!signaled_)
{
cv_.wait(lock);
}
}
private:
boost::mutex m_;
boost::condition_variable cv_;
bool signaled_;
};
Creo que es posible que necesite usar 'boost :: condition_variable_any' para que esto funcione. Ver: http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-variable – Nick
Además, el método condition_variable_any :: wait debe tener el mutex como parámetro, no el protector de seguridad. – Oliver
Hmm, me sale: 'impulso vacío :: :: condition_variable espera (boost :: unique_lock
IIRC, ManualResetEvent
s existen para permitir que varios subprocesos esperen en un objeto, y un subproceso para despertarse en el momento en que se señala el objeto. La parte de "reinicio manual" proviene del hecho de que el sistema no reinicia automáticamente el evento después de que despierta un hilo; lo haces en su lugar.
Esto suena muy similar a condition variables:
El patrón de uso general es que un hilo bloquea un mutex y luego llama
wait
en una instancia decondition_variable
ocondition_variable_any
. Cuando el hilo se despierta de la espera, comprueba si la condición adecuada ahora es verdadera y continúa si es así. Si la condición no es verdadera, entonces el hilo vuelve a llamar alwait
para reanudar la espera.
Básicamente tengo un hilo de escritor que siempre debe escribir y nunca ser bloqueado, mientras que tengo un hilo de lectura que solo puede leer cuando el escritor no está escribiendo ... si eso tiene sentido. Gracias – Polaris878
Diría que su diseño tiene sentido. –
- 1. Java Equivalente de .NET's ManualResetEvent y WaitHandle
- 2. ¿Cuál es el equivalente de Java de ManualResetEvent?
- 3. ManualResetEvent vs Thread.Sleep
- 4. Objective-C/Cocoa equivalent of C# ManualResetEvent
- 5. Cómo desechar ManualResetEvent
- 6. Aumentar el enlace estático
- 7. Aumentar el espacio permgen
- 8. Zócalo de cliente asíncrono ManualResetEvent retención de ejecución
- 9. ¿Cuándo usaría AutoResetEvent y ManualResetEvent en lugar de Monitor.Wait()/Monitor.Pulse()?
- 10. MSTest: cómo aumentar el tiempo de prueba
- 11. Java2D: aumentar el ancho de línea
- 12. ¿Aumentar el tamaño de letra en Firebug?
- 13. Cómo aumentar el tipo de objeto anónimo en C#
- 14. aumentar excepciones
- 15. Para hacer una elección entre ManualResetEvent o Thread.Sleep()
- 16. Cómo aumentar el tiempo en 1 hora
- 17. Java reemplazar cadena al aumentar el número
- 18. JAVA_OPTS para aumentar el tamaño del montón
- 19. ¿Reduce el número de incluye/requiere aumentar el rendimiento?
- 20. ¿Cómo aumentar un círculo junto con aumentar el texto dentro del círculo?
- 21. cómo aumentar backgroundTimeRemaining
- 22. java: necesidad de aumentar el rendimiento de cálculo de comprobación
- 23. cómo aumentar el tamaño de acumulación de JVM
- 24. aumentar el grosor de la línea de geom_smooth
- 25. Error al aumentar el conjunto de datos de referencias cruzadas
- 26. Para aumentar el período de tiempo de espera
- 27. ¿Cómo aumentar el tamaño de la pila de Java?
- 28. Qt Aumentar el tamaño de QTabBar de QTabWidget
- 29. Cómo aumentar el modificador de acceso de una propiedad
- 30. Android: aumentar el tamaño de la pila de llamadas
¿Qué funciones de evento desea emular? – curiousguy