Mój program ma dwa wątki:Jak mogę zsynchronizować dostęp do bazy danych między wątkiem do zapisu a wątkiem wczytywanym?
- głównym wątku wykonania, który obsługuje dane wejściowe użytkownika i kolejki się baza pisze
- Wątek narzędziowy, który budzi się w każdej sekundzie i opróżnia zapisuje do bazy
Wewnątrz wątku głównego czasami potrzebuję odczytów w bazie danych. Kiedy tak się dzieje, wydajność nie jest ważna, ale poprawność jest. (W idealnym świecie chciałbym czytać z pamięci podręcznej, nie robiąc w obie strony bazy danych - ale odłóżmy to na bok w celu dyskusji.)
Jak mogę się upewnić, że główny wątek widzi poprawna/nieaktywna baza danych?
Standardowy muteks nie zadziała, ponieważ istnieje ryzyko, że główny wątek złapie muteks zanim dane zostaną przepuszczone do bazy danych. To byłby wielki wyścig.
To, czego naprawdę chcę, to jakiś muteks, który pozwala, aby główny wątek wykonania działał tylko PO MOCZU, który został raz pobrany i zwolniony. Czy coś takiego istnieje? Jaki jest najlepszy sposób na rozwiązanie tego problemu?
AKTUALIZACJA: Po wykonaniu dodatkowych badań, mogę użyć Boost's Conditional Variable, aby rozwiązać ten problem. Albo to, albo po prostu ugryź kulę i przechowuj w pamięci moje zapiski. Dzięki za opinie!
Nie jestem pewien, czy to zadziała. Jeśli każdy wątek ma własne połączenie db, może nadal uzyskać dostęp do tej samej tabeli w bazie danych. Nic nie chroni pierwszego wątku przed dostępem do starych danych, które nie zostały jeszcze zaktualizowane przez drugi wątek. – Runcible
Dostęp do jednoczesnego pisania, a także czytania i pisania jest standardową funkcją menedżerów baz danych. Ponieważ pytanie jest oznaczone mysql, nie powinno być problemu. – wallyk
Powiedzmy, że wątek 1 powoduje wstawienie INSERT do tabeli Foo. Następnie - zanim wątek 2 się obudzi i opróżni zapis do bazy danych - wątek 1 wykonuje instrukcję SELECT na tabeli Foo. Nie ma rywalizacji o dostęp, ale wątek 1 wciąż czyta nieaktualne dane. – Runcible