[ Arbatash Vex @ 03.04.2007. 00:29 ] @
| Ja sam student ETF-a (racunarska tehnika i informatika) i pravim projekat "kernela" iz Operativnih Sistema 1.
Problem mi je kod sledeceg:
Na koji nacin mogu da dobijem stvarnu adresu nestaticke metode nekog objekta date klase, tj:
class Thread {
public:
void run();
};
Thread nit;
Kako naci adresu metode nit.run() tj adresu gde pocinje kod te metode kako bih mogao da je upisem u PCB
Moj asistent mi je rekao da napravim staticku medodu kojoj stavim objekat (nit) kao argument, i ona da mi pokrene run() metodu tog argumenta, a mogu da dobijem adresu staticke metode, to nije sprono. Ali kako da pomocu adrese objekta &nit i adrese staticke metode &(Thread::staticka_metoda) da dodjem do prave adrese metode run() za odredjeni objekat tipa Thread.
Inace radim u Borland C++ 3.1
[Ovu poruku je menjao Arbatash Vex dana 03.04.2007. u 01:59 GMT+1] |
[ X Files @ 03.04.2007. 10:22 ] @
Pogledaj možda ovde:
http://tinyurl.com/3b5bmw
(poslednji odgovor)
P.S. Ako nije tajna, ko je asistent?
[ Arbatash Vex @ 03.04.2007. 11:57 ] @
Hvala za pomoc, sad cu da ga izbistrim.
Ne znam da li smem da kazem koji je asistent, mozda to moze da utice na moje polaganje ispita :-P
[ Dragi Tata @ 03.04.2007. 13:22 ] @
Citat:
Arbatash Vex: Ali kako da pomocu adrese objekta &nit i adrese staticke metode &(Thread::staticka_metoda) da dodjem do prave adrese metode run() za odredjeni objekat tipa Thread.
Funkcije članice klase imaju iste adrese za sve objekte. U praksi, poziv funkcije članice za neki objekat je ekvivalentno pozivu slobodne funkcije sa dodatnim argumentom this koja je prijatelj toj klasi.
Na primer:
Code:
string a;
string b;
a.append("prvi"); //ispod haube: append("prvi", &a);
b.append("drugi"); //ispod haube: append("drugi", &b);
[ Arbatash Vex @ 03.04.2007. 13:48 ] @
Znaci slaba vajda od moje zelje.
Onda nemam pojma kako da upisem u PCB stvarnu adresu odakle mi pocinje odredjena nit, posto mi je to najvaznije za multithreading.
Na zalost, ne daju nam vise da to radimo u C-u inace bi bilo mnogo lakse.
[ Dragi Tata @ 03.04.2007. 14:11 ] @
Izvini na neznanju, a šta je to PCB?
Inače, možeš i u C++u da koristiš slobodne funkcije, zar ne? Ako ti ne daju, onda uradiš trik sa statčikom funkcijom koja primi adresu objekta kao argument, kastuje adresu u pointer na odgovarajući objekat i onda pozove članicu tog objekta.
Pogledaj recimo ovaj članak - ima i mnogo više nego što ti treba:
http://www.codeproject.com/win32/callback_adapter.asp
[ Arbatash Vex @ 03.04.2007. 15:08 ] @
PCB je struktura/klasa u kojoj se cuva kontekst procesa za neki odredjeni thread. Najcesce se u njemu cuva PC, SP, BP i procesorski registri, u slucaju da se ne cuvaju na steku, sto je bolja varijanta.
Svaki objekat Thread klase ima svoj PCB. Kada se stvara proces, u PCB.PC se upise pocetna adresa run() funkcije. I kad taj thread dodje na red za izvrsavanje funkcijom dispatch() se "nasilno" na stek push-ne adresa gde treba da se vrati kad zavrsi dispatch() (pocetnu adresu funkcije run()). Pa umesto da se vrati na sledecu funkciju posle dispatch() on skoci na run i pocne da je izvrsava sve dok se nekim interrupt-om ne prekine i da procesor drugom threadu.
Ukratko. Moramo da napravimo implementaciju niti u c++, a posle i simulaciju kernela pod windowsom, ali smemo da koristimo samo standardne staticke .h fajlove.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.