puzzin zadatak...
Koliko se ja razumem u ratarstvo, postoje 2 nacina slanja poruke: na
odredjeni broj i broadcast. E to treba da napises...
Dakle interfejs je:
send(broj_telefona, sirova_poruka);
broadcast(sirova_poruka);
Na izlazu imas red. Naravno, mislim na onaj red iz DRS-a. Pokusaj
uzimanja podatka iz reda blokira proces ako je red prazan. Eve ti
jedna implementacija tog reda, a ujedno i tutorial za boost i
multithreading:
#include <queue>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
class Queue {
public:
void put(const Data &data) throw() {
boost::mutex::scoped_lock lock(mutex);
q.push(data);
not_empty.notify_all();
}
Data get() throw() {
boost::mutex::scoped_lock lock(mutex);
while (q.empty()) not_empty.wait(lock);
Data rez = q.front();
q.pop();
return rez;
}
private:
std::queue<Data> q;
boost::mutex mutex;
boost::condition not_empty;
};
Svi znamo sta je mutex. U C++-u je zahvaljujuci mehanizmu destruktora
zakljucavanje i otkljucavanje mutex-a krajnje jednostavno. Kreiramo
lokalni objekat tipa "lock" (ovde je tip boost::mutex::scoped_lock).
Njegovo radjanje zakljucava mutex, njegova smrt otkljucava. Njegova
zivotna oblast ne mora da bude citava funkcija, uvek moze da se umetne
blok u kome zelimo zakljucavanje.
(Inace, moze se eksplicitno pozivati mutex.lock() i mutex.unlock(),
ali to je gvupavo.)
Sta je to condition? Naravno da ne znas kad nisi citao
dokumentaciju... To predstavlja neki uslov/stanje koji treba u nekim
situacijama da se "saceka", tj. da se blokira trenutni proces.
Preciznije... u ovom slucaju imamo stanje da red nije prazan
(not_empty). Ako neko pokusa da cita iz reda koji je prazan mora se
sacekati njegovo punjenje, dakle promena stanja. Standardna
konstrukcija je:
while (!uslov) uslovna_promenljiva.wait(lock);
uslov - logicki uslov koji cekamo
uslovna_promenljiva - boost::condition vezan za dati uslov/stanje
lock - e ovo je vazno... pazi sad...
Cekanje na neki uslov je uvek vezano za odredjenu kriticnu sekciju,
tj. za odredjeni mutex. I to ZAKLJUCANI mutex. Proces cekanja
(funkcija wait) podrazumeva otkljucavanje mutex-a i blokiranje
procesa, tako da dok jedan proces ceka u get() drugi proces moze da
radi put(). Pre izlaska iz wait, mutex ce opet biti otkljucan.
Mogucnost greske je minimalna (osim ako je ceo koncept los).
Jos da naglasim da je jedini oblik wait-a onaj gore... MORA DA IMA I
while (!uslov)!!!!! Razmisli zasto... Ma videli ste to u Javi...
Da se vratimo na tvoj drajver. Negde postoji red, negde postoje 2
funkcije. Tvoj drajver upisuje pristigle poruke u red. Koliko ces
procesa da kreiras i kako ce oni medjusobno da komuniciraju me
apsolutno NE zanima. Mozda mozes u prekidnoj rutini da punis izlazni
red... Tvoj problem... Ja ocu da iz tog reda dohvatam poruke (sa
blokiranjem ako je prazan) i to u formatu <broj-telefona,
sirova-poruka>.
E... isteruju me pa ne mogu da izvrsim recenziju poruke...
Ajd uzdravlje i sa srecom...
--
Dragan Milenkovic
odredjeni broj i broadcast. E to treba da napises...
Dakle interfejs je:
send(broj_telefona, sirova_poruka);
broadcast(sirova_poruka);
Na izlazu imas red. Naravno, mislim na onaj red iz DRS-a. Pokusaj
uzimanja podatka iz reda blokira proces ako je red prazan. Eve ti
jedna implementacija tog reda, a ujedno i tutorial za boost i
multithreading:
#include <queue>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
class Queue {
public:
void put(const Data &data) throw() {
boost::mutex::scoped_lock lock(mutex);
q.push(data);
not_empty.notify_all();
}
Data get() throw() {
boost::mutex::scoped_lock lock(mutex);
while (q.empty()) not_empty.wait(lock);
Data rez = q.front();
q.pop();
return rez;
}
private:
std::queue<Data> q;
boost::mutex mutex;
boost::condition not_empty;
};
Svi znamo sta je mutex. U C++-u je zahvaljujuci mehanizmu destruktora
zakljucavanje i otkljucavanje mutex-a krajnje jednostavno. Kreiramo
lokalni objekat tipa "lock" (ovde je tip boost::mutex::scoped_lock).
Njegovo radjanje zakljucava mutex, njegova smrt otkljucava. Njegova
zivotna oblast ne mora da bude citava funkcija, uvek moze da se umetne
blok u kome zelimo zakljucavanje.
(Inace, moze se eksplicitno pozivati mutex.lock() i mutex.unlock(),
ali to je gvupavo.)
Sta je to condition? Naravno da ne znas kad nisi citao
dokumentaciju... To predstavlja neki uslov/stanje koji treba u nekim
situacijama da se "saceka", tj. da se blokira trenutni proces.
Preciznije... u ovom slucaju imamo stanje da red nije prazan
(not_empty). Ako neko pokusa da cita iz reda koji je prazan mora se
sacekati njegovo punjenje, dakle promena stanja. Standardna
konstrukcija je:
while (!uslov) uslovna_promenljiva.wait(lock);
uslov - logicki uslov koji cekamo
uslovna_promenljiva - boost::condition vezan za dati uslov/stanje
lock - e ovo je vazno... pazi sad...
Cekanje na neki uslov je uvek vezano za odredjenu kriticnu sekciju,
tj. za odredjeni mutex. I to ZAKLJUCANI mutex. Proces cekanja
(funkcija wait) podrazumeva otkljucavanje mutex-a i blokiranje
procesa, tako da dok jedan proces ceka u get() drugi proces moze da
radi put(). Pre izlaska iz wait, mutex ce opet biti otkljucan.
Mogucnost greske je minimalna (osim ako je ceo koncept los).
Jos da naglasim da je jedini oblik wait-a onaj gore... MORA DA IMA I
while (!uslov)!!!!! Razmisli zasto... Ma videli ste to u Javi...
Da se vratimo na tvoj drajver. Negde postoji red, negde postoje 2
funkcije. Tvoj drajver upisuje pristigle poruke u red. Koliko ces
procesa da kreiras i kako ce oni medjusobno da komuniciraju me
apsolutno NE zanima. Mozda mozes u prekidnoj rutini da punis izlazni
red... Tvoj problem... Ja ocu da iz tog reda dohvatam poruke (sa
blokiranjem ako je prazan) i to u formatu <broj-telefona,
sirova-poruka>.
E... isteruju me pa ne mogu da izvrsim recenziju poruke...
Ajd uzdravlje i sa srecom...
--
Dragan Milenkovic
- Follow-Ups:
- Re: puzzin zadatak...
- From: "z l a t k o" <drndaz@EUnet.yu>
- Re: puzzin zadatak...
Previous by date: HITNO
Next by date: Re: HITNO
Previous by thread: Re: HITNO Next by thread: Re: puzzin zadatak...
Previous by thread: Re: HITNO Next by thread: Re: puzzin zadatak...