Witam, mam "drobny" problem. Otóż chcę napisać program, który będzie mi wczytywał dane z pliku wielowątkowo tzn. w taki sposób, że główny wątek będzie "ładował" dane z pliku do wolnego bufora a reszta wątków będzie konwertować te dane do odpowiednich obiektów.
Póki co zrobiłem część odpowiadającą za wielowątkowe liczenie wierszy w pliku (by wiedzieć jak dużą tablicę obiektów mam stworzyć).
Mam niestety mały problem, który udało mi się zlokalizować, ale mam problem ze znalezieniem rozwiązania.
Otóż utworzone wątki przestają działać, gdy zmienna break_threads
przyjmie wartość true. Do tego czasu wszystkie wątki chodzą w pętli while. Gdy główny wątek załaduje dane do odpowiedniego bufora i znajdzie wolny wątek to przekazuje mu dane i ustawia zmienną wait_for_data[i] = 0;
- to powoduje, że wątek zaczyna wykonywać obliczenia.
Problem jest taki, że czasami jakiś wątek nie wykonuje obliczeń (chodzi prawdopodobnie o jeden z ostatnich buforów). Chodzi prawdopodobnie o to, że gdy następuje zmiana wartości zmiennej wait_for_data[i]
to wątek od razu ładuje kolejny bufor. Natomiast wewnątrz wątku prawdopodobnie, od czasu do czasu, są pewne zastoje i zanim pętla while wewnątrz wątku sprawdzi zmienną wait_for_data
to główny wątek zmienia wartość break_threads
na true i wątek nie wykonuje ostatnich obliczeń. Dzieje się to sporadycznie (głównie przy małych buforach), ale jednak... I chcę tego uniknąć!
Jednym z rozwiązań tego problemu jest umieszczenie Sleep(100) przed przypisaniem zmiennej break_threads
wartości true ale to rozwiązanie średnio mnie zadowala, bo z jednej strony wydłuża pracę funkcji a z drugiej strony nie gwarantuje 100% pozbycia się problemu.
Dlatego, jeśli jest taka możliwość, bardzo proszę o wskazanie jakiegoś sensownego rozwiązania.
Poniżej umieszczam kod opisywanych funkcji.
//nvm