問題:
Boostを使用してサーバーを開発していますが、初期化時にメイン スレッドによって一部のデータが読み込まれる xml ファイルがあります。
実行中にいくつかの変更が発生する可能性があり、xml ファイルに保存する必要があります。この目的のために、関数 store() が Database というクラスに実装されました。
Database::store()
{
boost::mutex::scoped_lock lock(_databaseMutex);
//xml file wirting
}
クラス Database を作成したメインとは異なる別のスレッド(ソケット接続など) からの変更を保存したい場合、xml はスレッドが安全でないと思われるため失敗します。
考えられる解決策:
私の考えは、次のような他のスレッドからの通知を待っているサーバー(メインスレッド)にループを作成することです:
void loopQueue()
{
boost::mutex::scoped_lock lock(_queueMutex); // close the lock
while(true)
{
while (_queuedActions.empty())
{
_updateAvailable.wait(lock);
}
getDatabase(param)->store(); //stores database
_queuedActions.pop();
}
}
このようにして、xml の書き込みはクラッシュしません。
質問:
- この種の問題に対するより効率的またはより良い解決策はありますか、それともこれが正しい方法ですか?