2012-11-15 26 views
8

SORUN:Akıllı çözüm

Ben Boost ile bir sunucu geliştiriyorum ve bazı veri başlatma sırasında ana iş parçacığı tarafından yüklendiği kaynak bir xml dosyası var .

yürütülmesi sırasında bazı değişiklikler ortaya çıkabilir ve xml dosyasında saklanmalıdır. Bu amaçla bir işlev deposu() adlı bir sınıf Veritabanında uygulandı:

Database::store() 
{ 
    boost::mutex::scoped_lock lock(_databaseMutex); 
    //xml file wirting 
} 

I (sınıf Veritabanı oluşturulan ana farklı başka bir iş parçacığı bir soket bağlantısı değiştirir saklamak istiyorsanız, örneğin, xml iş parçacığı güvenli olmayan gibi görünüyor.

Posible çözeltisi:

Benim fikrim, diğer iş parçacığı gelen bildirimler için böyle bir şey bekleme sunucusu (ana iş parçacığı) içinde bir döngü oluşturmaktır:

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(); 
    } 
} 

Bu şekilde xml yazma yapar çökmez.

Soru: Bu tür sorunları için daha verimli veya daha iyi bir çözüm

  • var mı yoksa bu hak yoludur?

cevap

3

Her bağlıdır neler ana iş parçacığı yapıyor ve nasıl programı tasarlanmış ve uygulanmıştır.

önerdiğiniz çözüm iyi çalışır ancak işlem xml dosyasına yazar sadece tek bir iş parçacığı domuzu.

Eğer boost::asio tanıyor musunuz? Tek bir iş parçacığı veya ioservice::run çağıran iş parçacığı havuzu biriyle boost::asio kullanacağı herhangi sunucusunda

. Xml dosyasına yapılan güncellemeler, asio olay döngüsüne "gönderilir" ve iş parçacığı herhangi birinin iş parçacığı tarafından (örneğin ioserive :: run adlı iş parçacıkları) gönderilir/gerçekleştirilir. Bu, sisteminizin daha az iş parçacığı kullandığı ve kullandığı iş parçacıklarının çok sayıda eşzamansız işlem gerçekleştirebildiği anlamına gelir.

Not: boost::asio::post bu/kontrol xml dosyasına erişimi seri hale getirmek verir, asio olay döngü içinde adında bir işlevi olması kullanılır

bakınız: Bu konuda okuyorum boost::asio boost::asio::post

+1

Şu anda konu, bağlantı başına bir iplik için de ilginç görünüyor. –

+1

En iyi yol bir iş parçacığı havuzu kullanmaktır. Sunucu başına çok sayıda farklı bağlantıyı (örneğin, 1000'lerce çağrıyı işleyen bir VOIP anahtarı) işlemek zorundaysa, bağlantı başına bir iş parçacığı oluşturmaya zorlanmaz. “Boost :: asio” ile sağlanan örnekler hem basit hem de karmaşık senaryoları kapsamaktadır, ne yazık ki daha karmaşık senaryoların bazıları açıklanmamıştır/belgelenmemiştir.Burada, "boost :: asio" ile çok parçalı sunucular geliştirmek için farklı teknikleri açıklayan bazı mükemmel kaynaklar var. IMHO 'boost :: asio' kullanmış olduğum en iyi yazılmış/en kullanışlı C++ kütüphanelerinden biridir. – mark