Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem signalizacije izmedju niti

[es] :: .NET :: Problem signalizacije izmedju niti

[ Pregleda: 4449 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

jeremycod
Jeremic Zoran

Član broj: 7419
Poruke: 72
*.ptt.yu



Profil

icon Problem signalizacije izmedju niti22.06.2003. u 12:44 - pre 253 meseci
Imam sledeci problem :
Napravio sam program proizvodjac-potrosac koji razmenjuju podatke preko bafera. To su u stvari jedna nit proizvodjac i tri niti potrosaca. Potrebno je izvrsiti signalizaciju niti, tj kada je bafer pun zaustavlja se proizvodjac (a nakon uzimanja jednog podatka signalizira se proizvodjacu da nastavi sa radom)i kada je bafer prazan zaustavljaju se potrosaci( a nakon unosa jednog podatka signalizira im se da mogu da nastave sa radom).
Mislim da bi to trebalo uraditi sa


Monitor::Pulse(proizvodjac);
...
Monitor::wait(potrosac);



Monitor::Pulse(potrosac);
...
Monitor::wait(proizvodjac);


ali ne znam kako se koriste ove funkcije u Visual C++.NET-u, tj ne znam sta bi konkretno trebalo da stavim kao argumente ovih funkcija.Da li neko moze da mi pomogne da resim ovaj problem?
Hvala.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
..g-c5300-3.dialup.nethere.net



+6 Profil

icon Re: Problem signalizacije izmedju niti22.06.2003. u 18:59 - pre 253 meseci
http://www.codeproject.com/managedcpp/mcppthreadsync01.asp

Uživaj...
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.client.attbi.com



+18 Profil

icon Re: Problem signalizacije izmedju niti22.06.2003. u 19:44 - pre 253 meseci
Ne bih se slozio sa DT: Monitor.Enter i .Exit su u stvari lock u C#-u (aha, covek radi u MC++u), a lock nije najbolje prilagodjen za reader-writer problem. Za ovaj problem mi se cini da je ReaderWriterLock bolji izbor.

http://msdn.microsoft.com/libr...rLockClassTopic.asp?frame=true
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
..g-c5300-2.dialup.nethere.net



+6 Profil

icon Re: Problem signalizacije izmedju niti22.06.2003. u 20:32 - pre 253 meseci
Ne znam tačno kakav mu je to bafer i šta radi, ali čovek je jasno postavio pitanje kako da koristi Monitor::Pulse i Monitor::Wait, a to je objašnjeno u članku na koji sam ostavio link.

Off-topic: svojevremeno sam se namučio da nađem dobru implementaciju za RW lockove u native C++u. Na kraju sam je našao u Richter-ovoj knjizi i to 4-tom izdanju.
 
Odgovor na temu

jeremycod
Jeremic Zoran

Član broj: 7419
Poruke: 72
*.ptt.yu



Profil

icon Re: Problem signalizacije izmedju niti22.06.2003. u 23:38 - pre 253 meseci
Mislim da sam malo brzopleto napisao da su monitor::pulse() i monitor::wait() resenje mog problema. Pogledao sam ove linkove gore i konsultovao neku literaturu i mislim da to nece moci da prodje jer ove dve metode moraju da se koriste unutar sinhronizovanog bloka, tj. unutar Monitor::Enter() i Monitor::Exit(). Meni je ovde potrebno da jedna nit signalizira drugoj niti koja ceka da se dogodi neki uslov da moze da se odblokira.

Naisao sam na MSDN na AutoResetEvent i ManualResetEvent i mislim da je to, ali nikako da provalim kako se koriste ove metode Set(),WaitOne(), i Reset(). Uvek mi se niti blokiraju i nemogu da ih ponovo odblokiram sa Set().

Da li neko zna kako se koriste ovi tipovi i da li je to ono sto meni treba?


Evo sta na MSDN pise za ove tipove:


ManualResetEvent allows threads to communicate with each other by signaling. Typically, this communication concerns a task which one thread must complete before other threads can proceed.

When a thread begins an activity that must complete before other threads proceed, it calls Reset to put ManualResetEvent in the nonsignaled state. This thread can be thought of as controlling the ManualResetEvent. Threads that call WaitOne on the ManualResetEvent will block, awaiting the signal. When the controlling thread completes the activity, it calls Set to signal that the waiting threads can proceed. All waiting threads are released.

Once it has been signaled, ManualResetEvent remains signaled until it is manually reset. That is, calls to WaitOne return immediately.

You can control the initial state of a ManualResetEvent by passing a Boolean value to the constructor, true if the initial state is signaled and false otherwise.

ManualResetEvent can also be used with the static (Shared in Visual Basic) WaitAll and WaitAny methods.

For more information about thread synchronization mechanisms, see ManualResetEvent in the conceptual documentation


http://msdn.microsoft.com/libr...nualreseteventmemberstopic.asp
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Problem signalizacije izmedju niti23.06.2003. u 23:09 - pre 253 meseci
Ovako, na prvi pogled:

1. Treba ti jedan ManualResetEvent objekat na koji će da čeka proizvođač. Kad god potrošač pokupi neki podatak, on pozove Set metod, a to probudi proizvođača koji napravi nov podatak (ili više njih dok ne napuni bafer), resetuje ManualResetEvent i ode da spava (pozove ManualResetEvent::WaitOne).

2. Treba ti i jedan ManualResetEvent objekat na koji će da čekaju potrošači. Kad god proizvođač proizvede nov podatak (ili još bolje više podataka) setuje ovaj objekat i probudi jedan ili više potrošača. Kad poslednji potrošač isprazni buffer, resetuje ovaj objekat i svi potrošači idu na spavanje.

3. Da ne bi došlo do "data corruption"-a, obavezno koristi ReaderWriterLock kad god nešto petljaš sa baferom - bilo kod potrošača ili proizvođača.
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com



+18 Profil

icon Re: Problem signalizacije izmedju niti23.06.2003. u 23:14 - pre 253 meseci
Ili mozes da koristis samo jedan RW lock:

Code:

ReaderWriterLock rwl = new ReaderWriterLock();

Reader:
while 
{
  rwl.AcquireReaderLock(timeOut);
  read();
  rwl.ReleaseReaderLock();
}

Writer:
while
{
  rwl.AcquireWriterLock(timeOut);
  write();
  rwl.ReleaseWriterLock();
}
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Problem signalizacije izmedju niti23.06.2003. u 23:35 - pre 253 meseci
Ali kako to rešava postavljeni problem?

Citat:
tj kada je bafer pun zaustavlja se proizvodjac (a nakon uzimanja jednog podatka signalizira se proizvodjacu da nastavi sa radom)i kada je bafer prazan zaustavljaju se potrosaci( a nakon unosa jednog podatka signalizira im se da mogu da nastave sa radom).


On želi da potrošači signaliziraju proizvođaču kad je bafer prazan i obrnuto da proizvođač signalizira potrošačima kad je bafer pun.
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com



+18 Profil

icon Re: Problem signalizacije izmedju niti24.06.2003. u 01:02 - pre 253 meseci
Priznajem, nisam dobro procitao pitanje! Izgleda da je odgovor definitivno koristiti dva monitora.
 
Odgovor na temu

jeremycod
Jeremic Zoran

Član broj: 7419
Poruke: 72
*.ptt.yu



Profil

icon Re: Problem signalizacije izmedju niti24.06.2003. u 19:31 - pre 253 meseci
Hvala vam svima na pomoci.
Uspeo sam da resim problem. To sa dva monitora sam probao ali nikako nije islo. Uglavnom ManualResetEvent definitivno sluzi da signalizira iz jedne nit drugoj da se desio neki dogadjaj. Metodu WaitOne() sam koristio da blokiram proizvodjaca kada je bafer pun, a cim se ubaci jedan element sa Set() se iz niti potrosaca odblokira proizvodjac. Isto to sam napravio i za prazan bafer i sve savrseno funkcionise, samo me buni pomalo to sto niti neravnomerno pristupaju bafer. npr prva nit pristupi baferu 20-tak puta dok ostale niti ne pristupe nijednom, pa onda druga krene nekoliko put. U sustini nikad nemogu da predvidim kako ce da se ponasaju iako sve tri niti koriste istu funkciju niti.
Pozdrav svima.
 
Odgovor na temu

[es] :: .NET :: Problem signalizacije izmedju niti

[ Pregleda: 4449 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.