Pregunta

Estamos tratando de construir una clase que proporciona el MFC CRecordset (o, en realidad, la CODBCRecordset clase ) de seguridad hilo. Todo parece realmente trabajar bastante bien para las diversas funciones como la apertura y el movimiento a través del conjunto de registros (adjuntamos estas llamadas con secciones críticas), sin embargo, sigue siendo un problema, un problema que parece introducir los puntos muertos en la práctica.

El problema parece radicar en nuestro constructor, así:

CThreadSafeRecordset::CThreadSafeRecordset(void) : CODBCRecordset(g_db)
{ // <-- Deadlock!
}

El otro hilo podría ser uno de haber terminado en CThreadSafeRecordset :: Close () a pesar que guarda la llamada Cerca cerrado, pero que en realidad no importa ya que el constructor se enhebrando desconocen. Asumo la clase CRecordset original es el culpable, haciendo cosas malas en el momento de la construcción. He mirado en torno a las técnicas de programación de solucionar este problema, pero estoy seguro de lo que podría ser la mejor solución? Puesto que no tenemos código y no podemos controlar otro tipo de código en nuestro constructor, no podemos concluir nada especial en una sección crítica ...?

Actualización: Gracias por la entrada; He marcado lo que terminó con como la respuesta a mi pregunta. Que, en combinación con el retorno de una shared_ptr como el devuelto ejemplo para facilitar la actualización del código de hilo conscientes existente.

¿Fue útil?

Solución

Puede hacer que el constructor privado CThreadSafeRecordset, a continuación, proporcionar un método de fábrica público que participa en el bloqueo y devuelve una instancia.

Otros consejos

Si no hay manera de hacer CODBCRecordset mover sus operaciones a hilos inseguros fuera del constructor (un constructor por defecto seguido de un Initialize () llamada, por ejemplo), siempre se puede utilizar la composición en lugar de herencia. Deje CThreadSafeRecordset ser una envoltura alrededor de CODBCRecordset en lugar de una subclase de la misma. De esta manera, se puede construir de forma explícita el conjunto de registros siempre que lo desee, y puede defender con rigor lo que es apropiado.

El inconveniente, por supuesto, es que usted tiene que envolver todos CODBCRecordset método que desea exponer, incluso los que no se relacionan con sus garantías de roscado. Una macro C en el archivo cpp (por lo que no puede escapar y afligir a sus clientes) puede ayudar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top