8

問題:

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 の書き込みはクラッシュしません。

質問:

  • この種の問題に対するより効率的またはより良い解決策はありますか、それともこれが正しい方法ですか?
4

1 に答える 1

3

それはすべて、メインスレッドが実行していることと、プログラムがどのように設計および実装されているかに依存します。

提案するソリューションは正常に機能しますが、xmlファイルへの書き込みを処理するためだけに単一のスレッドを占有します。

あなたは精通していboost::asioますか?

どのサーバーboost::asioでも、を呼び出す単一のスレッドまたはスレッドのプールのいずれかで使用しますioservice::run。xmlファイルへの更新は、asioイベントループに「ポスト」され、スレッドプール内の任意のワーカースレッド(つまり、ioserive :: runを呼び出したスレッド)によってディスパッチ/実行されます。これは、システムが使用するスレッドが少なく、使用しているスレッドが多数の非同期操作を実行できることを意味します。

注:boost::asio::postasioイベントループ内で呼び出される関数を持つために使用されます。これにより、xmlファイルへのアクセスを制御/シリアル化できます。

見る: boost::asio boost::asio::post

于 2012-11-15T11:12:07.137 に答える