Nous essayons de construire une classe qui fournit le MFC CRecordset (ou, vraiment, la classe CODBCRecordset) sécurité des threads. Tout semble bien fonctionner pour les diverses fonctions comme l'ouverture et le déplacement dans le jeu d'enregistrements (nous joignons ces appels avec des sections critiques), cependant, un problème subsiste, un problème qui semble introduire des blocages dans la pratique.Construction d'un objet C++ (MFC CRecordset) thread-safe
Le problème semble résider dans notre constructeur, comme ceci:
CThreadSafeRecordset::CThreadSafeRecordset(void) : CODBCRecordset(g_db)
{ // <-- Deadlock!
}
L'autre fil peut être un ayant fini dans CThreadSafeRecordset :: Close() malgré nous garde l'appel ci-joint Fermer, mais doesn Pas vraiment d'importance puisque le constructeur est threading ignorant. Je suppose que la classe CRecordset originale est le coupable, faisant de mauvaises choses au moment de la construction. J'ai cherché des techniques de programmation pour contourner ce problème, mais je ne sais pas quelle pourrait être la meilleure solution? Puisque nous n'avons pas de code et que nous ne pouvons pas contrôler d'autres codes dans notre constructeur, nous ne pouvons pas envelopper quelque chose de spécial dans une section critique ...?
Mise à jour: Merci pour l'entrée; J'ai marqué ce que j'ai fini par comme la réponse à ma question. Cela, en combinaison avec le renvoi d'un shared_ptr en tant qu'instance renvoyée pour faciliter la mise à jour du code existant sans traitement du thread.