Tym razem nie chodzi o niedziałający kod. Mój kod działa, nawet nieźle. Więc w czym problem? Zacznijmy od początku.
Jak pewnie (nie) wiecie piszę EasyScript który jest interpreterem mojego języka ES. Działa on bez zarzutu, nawet coś czasami go rozwijam, ale chodzi tutaj o podstawę jego działania, a mianowicie o sposób wykonywania procedury jak IF,SET,ADD czy cokolwiek.
Mianowicie, mam ustalony wzór procedury która może być wykonywana przez ES, gdzieś mam też do niej wskaźnik. Wszystko śmiga.
Stosuje ES międzyinnymi w jednym z moich większych projektów PRNDWN. Jest to bot internetowy, który skacze po stronach i pobiera jakieśtam pliki - definicję jak ma to zrobić są właśnie w ES. PRNDWN jest wielowątkowy. I tu zaczynają się schody, bo:
Mam pare interpreterów ES (w obiektach). Jeden na główny wątek i po jednym na każdy wątek poszukiwacza. Problem polega na tym, że większość dodanych (na potrzeby PRNDWN) procedur ES musi się odwołać do obiektu wątku, którego nie osiągniemy od tak. Dlatego zrobiłem zmienną globalną, i gdy któryś wątek wykonuje ES to przypisuje pod tą zmienną referencję do siebie.
I tu jest problem:
Jest szansa, że gdy jeden wątek będzie wykonywać polecenia, drugi wątek zmieni referencję, i stanie się coś nieciekawego. Albo (tutaj akurat nie jestem pewien) dwa interpretery ES wykonają naraz tą samą procedurę - też problem.
Myślałem już nad zrobiniem sekcji krytycznej, ale spowodowałoby to zdecydowanie zmniejszenie wydajności ES i co za tym idzie całego programu.
Macie może jakieś pomysły jak to rozwiązać?
Jeszcze taka mała podpowiedź: ES jest teoretycznie obiektowy a w praktyce to spora część jego kodu niskiego poziomu jest w procedurach.