Problem synchronizacji

0

witam

Probuje rozwiazac nastepujacy problem, ktos pomoze?

Mamy 3 klasy.

Pierwsza klasa to klasa DataSource, posiada ona jedna metode getData(), zwraca liczbe int co jakis losowy odcinek czasu.
Jej wywolanie powoduje równiez zablokowanie watku w, którym zostanie wywolana. Pseudokodem mozna ja opisac tak:
int getData()
{
sleep(rand()%255);
return rand()%N;
}

Druga klasa to klasa Reciever, na jej potrzeby dziala watek, który jest niezalezny od watku glownej aplikacji.
Klasa ta odbiera dane z DataSource, a nastepnie wrzuca je do kolejki. Mozna ja opisac w ten sposób:
void ThreadFunc()
{
while (true)
list.Insert(DataSource.getData());
}

Trzecia klasa posiada natomiast rózne metody, ktorych reakcja powinna byc uzalezniona od obecnosci odpowiednich
elemtnow w liscie z klasy Reciever. Programista powinien wywolywac funkcje z klasy trzeciej,
funkcje te powinny czekac w sposób NIEAKTYWNY na obecnosc elementu w liscie.
Jezeli dany element sie pojawi powinny wykonac odpowiednie operacje.

Rozwiazania, które mi nie odpowiada:
Najprosciej byloby zrobic delegacje i eventy w klasie Reciever, odbierac dane z klasy DataSource,
nastepnie wywolywac odpowiedni event na podstawie otrzymanego numerku. Takie rozwiazanie jednak
zmienia troche filozofie calego ukladu. programista musi podstawiac funkcje pod eventy z klasy Reciever,
a ja CHCE tak aby programista wywolywal funkcje z klasy trzeciej, ta funkcja zaczekala na element
w liscie a nastepnie zwrócila mu jakis wynik.

Rozwiazanie, które przyszlo mi do glowy:
Zrobic w klasie Reciever tablice kolejek, której elementy bede stanowic semafory dla danej
funkcji z klasy trzeciej. tablica bedzie miala rozmiar 1..N. Kiedy jakas funkcja z klasy trzeciej
bedzie chciala zaczekac na jakis element, doda sie do odpowiedniej kolejki pod odpowiednim
indeksem tablicy - doda semafor, który na poczatku bedzie zablokowany.
Nastepnie funkcja w klasie trzeciej zrobi semafory[M][Z].wait(), natomiast klasa Reciever,
kiedy przyjdzie element o numerku M zrobi semafory[M][Z].signal(), tak aby odblokowac wszystkie
semafory tyczace sie danego elementu i funkcje oczekujace na element rusza z dzialaniem.

0

Ile będzie egzemplarzy 3-ciej klasy ? I czy wszystkie będą działać w jednym wątku ? Jeśli tak to nie potrzebna jest kolejka, bo wątek główny będzie oczekiwać zawsze max na 1 element.
Generalnie zrobiłbym to za pomocą EventWaitHandle. Trzecia klasa powiadamia Receiver'a, że chce któryś element i czeka na odpowiedź. Receiver jeśli ma dostępny ten obiekt to od razu go odsyła, jeśli nie to wrzuca zamówienie do zbioru oczekujących, a kiedy DataSource rzuci coś nowego to sprawdza, czy ktoś nie oczekuje na te dane - jeśli tak to realizuje oczekujące zamówienie wysyłając event.

1 użytkowników online, w tym zalogowanych: 0, gości: 1