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?
czytam na ten temat W tej chwili temat wygląda interesująco, również dla jednego wątku na połączenie. –
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