Wpis z mikrobloga

Hej,
Co zastosowalibyście w celu rozwiązania problemu, że klasa Writer potrzebuje wysłać dane do X wątków. (Nie rozdziela tych danych) tylko wysyła do każdego wszystko co ma. W sumie wystarczyła by jakaś globalny vector tylko skąd wiedzieć, że wszystkie wątki już sobie dane pobrały ( i można je unicestwić). (najlepiej, żeby nie trzeba było blokować odczytu -- w sensie, nowy element będzie można odczytać kiedy będzie kompletny w pamięci i wszystkie wątki mogą to robić 'na raz').

#programowanie #naukaprogramowania #c #cpp #pthread #posix
  • 6
@xaoc: Większość wzorców komunikacyjnych (tutaj tzw broadcasting, one-to-many) da się zaimplementować za pomocą (std::conditional_varible](http://en.cppreference.com/w/cpp/thread/condition_variable_any).

Tylku tutaj możesz sobie pozwolić by wielu odczytywało jednocześnie, więc korzystasz z jednego globalne go std::shared_mutex które wymaga użycia jednego globalnego std::conditional_varible_any oraz jakiejś dowolnej twojej zmiennej którą można odczytywać w wielu wątkach na raz. (Odczytywane lub kopiowanie jest w pełni thread save, nie tylko reetrant. Przykładowo wektor i lista tak, ale mapa i
Przepraszam, że tak późno odpisuję.
Z dokumentacji wynika, że sharedmutex są od c++17. Ja muszę korzystać z C++11.

Co do przykładu, jutro albo wieczorem go przetestuję wygląda, bardzo jasno.

Tylko ja bardziej się zastanawiam, gdzie trzymać to moje dane. Chodzi o to, że daną powinienem zapomnieć kiedy już wszystkie wątki sobie ją pobrały i je wysłały. Ja sobie napisałem buffor cykliczny (na moim kompie działa ale wydaje mi się, że na
@lionbest: Hej, a co do warunku, jak mam 100 tych waits to muszę mieć 100 i (załóżmy, że będzie to zmienna bool).

Inaczej: Mogę budzić 100 wątków jedną zmienną bool?
@xaoc: notifyall nie przesyła nic, tylko budzi wszystkie wątki czekające poprzez wait (ten z warunkiem tylko jeżeli jest spełniony, spełnienie warunku nie budzi go samo z siebie), tylko musisz pamiętać aby sprawdzić czy wszystkie wątki są gotowe i czekają na waits, do tego pewnie potrzebujesz nie jednego licznika który będziesz modyfikował. Skoro nie masz doświadczenia to prób sobie jakieś przykłady i przetestuj je, bo wielowątkowość nie jest łatwa.

Co do
@lionbest: sprawa jest bajecznie prosta bo to na x soketach wysyłam te same dane. Kwestia tylko upewnienia się że ich nie zgubie. Napisałem to po swojemu i dziala. Ale chciałbym bardziej składnia C++ i całkowicie poprawnie :)

Jutro przyjrzę się dokładnie temu co napisałeś, bo nie jest to latwe.

Właśnie przykłady to jest coś co zawsze ciężko dobrac, niektóre są oczywiste niektóre poruszają dobry temat ale tylko dla 2 wątków a