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?
Şu anda konu, bağlantı başına bir iplik için de ilginç görünüyor. –
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