建C++オブジェクトのMFC CRecordset)スレッドを安全に
-
20-09-2019 - |
質問
今の構築を提供するクラスのMFC CRecordset (または、本当に CODBCRecordset クラスの)スレッドの安全性です。もって働い出すかものなど、ハイスペックと多彩な機能を開を移動しながrecordsetしも同封してこれらの話とそのクリティカルセクション)しかし、一つ問題があること、問題のようなデッドロックを紹介します。
この問題のように当社のコンストラクタのようになります:
CThreadSafeRecordset::CThreadSafeRecordset(void) : CODBCRecordset(g_db)
{ // <-- Deadlock!
}
その他のスレッドがも結CThreadSafeRecordset::Close()が守ら同封の、そのいからコンストラクタはスレッドで存在すら知らなかこの原CRecordsetクラスは、犯人、そのことは悪いことで工期の短縮につながった。また周囲のためのプログラミング技術をこの問題が、私は迷うのが最善の解決法は?ていないコードの制御ができないのでその他のコードを当社のコンストラクタできないのでラップも特に重要な部---?
更新: の入力私は著しい結果としての答えです.この組み合わせに戻る shared_ptr として返されるインスタンスが容易に既存のスレッドを知らずのコードです。
解決
しないように注意してください CThreadSafeRecordset
コンストラクタ、その公開ファクトリメソッドが参加して自のロックを返しますインスタンス.
他のヒント
いうCODBCRecordset進するためにスレッド安全でない業務のコンストラクタ(デフォルトのコンストラクタおよInitialize()を呼び出しとします)を利用できることが構成ではなく継承関係を示します。ましょうCThreadSafeRecordsetするラッパCODBCRecordsetの代わりにクラスのサブクラスです。そのように、明示的に構築recordsetをいつ、守備ができてい厳密さが適しています。
の欠点はもちろん、あるいラップ 毎 CODBCRecordset方法をご希望の露出であっても、なんで関わるネジ切り拓く。Cマクロで、cppファイルできるような脱及び復興支援に深くお客様)があります。