|
Szukam rozwiązania dla problemu niżej opisanego. Wszelkie pomocne rozwiązania można przesyłać mailowo lub dzwoniąc pod nr tel 666-359-103...
Zasada jest prosta, serwer słucha na socketach (za pomocą boost::asio), i po dostaniu odpowiedniego komunikatu zwraca jakąś odpowiedź. Odpowiedzi są generowane na podstawie danych w bazie (PostgreSQL), do której dostęp jest za pomocą libpqxx. Jako, że generowanie niektórych odpowiedzi może czasem odrobinkę trwać, postanowiłem całość uruchomić z użyciem wątków. Wątki mam zaimplementowane za pomocą boost::thread. Wykorzystałem do tego między innymi przykłady integracji boost::asio i boost::thread. Jako, że libpqxx nie jest thread-safe, otwieram nowe połączenie z bazą danych dla każdego nawiązanego połączenia na socketach, gdzie każda metoda asynchroniczna jest uruchamiana z pomocą boost::asio::io_service::strand, co w efekcie powinno zapewnić że jedno połączenie z bazą danych działa na jednym wątku. A mimo to przy uruchamianiu kilku zapytań jednocześnie (zazwyczaj wystarczą już 3), serwer się wysypuje (nieodmiennie przy próbach dostępu do bazy) - jedno zapytanie na raz (a co za tym idzie brak równoległych dostępów do bazy) działa bezbłędnie, co doprowadza mnie do wniosku, że jest to problem pqxx vs. wątki. Niestety utknąłem w tym punkcie i nie mam pojęcia jak to dalej ruszyć :/
|