2012-11-15 8 views
8

PROBLEM:Inteligentne rozwiązanie do przechowywania danych XML wątku bezpieczny z Boost,

Zajmuję serwer z Boost, i nie jest to plik XML, z których niektóre dane są ładowane przez głównego wątku przy inicjalizacji .

Podczas wykonywania niektóre zmiany mogą się zdarzyć i powinny być przechowywane w pliku xml. W tym celu sklep function() został wdrożony w klasie o nazwie Database:

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

Jeśli chcę, aby zapisać zmiany z innego wątku inny od głównego który stworzył klasę Database (połączenia gniazda, na przykład), xml kończy się niepowodzeniem, ponieważ wydaje się, że wątek jest niebezpieczny. Rozwiązanie

Posible:

Mój pomysł jest utworzenie pętli na serwerze (główny wątek) czeka na zawiadomień od innych wątków, coś takiego:

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

ten sposób xml pisanie robi bez awarii.

Pytanie:

  • Czy jest bardziej efektywny lub lepszym rozwiązaniem dla tego rodzaju problemu, czy jest to właściwa droga?

Odpowiedz

3

Wszystko zależy od tego, co robi główny wątek i od tego, w jaki sposób program został zaprojektowany i wdrożony.

Proponowane rozwiązanie będzie działało dobrze, ale wieje jeden wątek tylko do przetwarzania zapisów w pliku xml.

Czy znasz boost::asio?

Na dowolnym serwerze użyłbym boost::asio z jednym wątkiem lub pulą wątków wywołujących ioservice::run. Aktualizacje pliku xml są "publikowane" w pętli zdarzeń asio i są wywoływane/wykonywane przez dowolny wątek roboczy w jego wątku (to jest wątki, które wywołały ioserive :: run). Oznacza to, że system używa mniej wątków, a wątki, z których korzysta, mogą wykonywać wiele operacji asynchronicznych.

Uwaga: boost::asio::post służy mieć funkcję o nazwie w ASIO pętli zdarzeń, to pozwala na kontrolowanie/serializacji dostępu do pliku xml

Patrz: boost::asio boost::asio::post

+1

czytam na ten temat W tej chwili temat wygląda interesująco, również dla jednego wątku na połączenie. –

+1

Najlepszym sposobem jest użycie puli wątków. Rozrastanie się wątku na połączenie nie jest skalowane, jeśli serwer musi obsługiwać dużą liczbę różnych połączeń (na przykład przełącznik VOIP obsługujący 1000 połączeń). Przykłady dostarczone z 'boost :: asio' obejmują zarówno proste, jak i złożone scenariusze, niestety niektóre z bardziej złożonych scenariuszy nie są wyjaśnione/udokumentowane.Jest tu kilka doskonałych zasobów, które wyjaśniają różne techniki tworzenia wielowątkowych serwerów z 'boost :: asio'. IMHO 'boost :: asio' jest jedną z najlepiej napisanych/najbardziej użytecznych bibliotek C++, których używałem. – mark

Powiązane problemy