Avatar billede datamaker Nybegynder
18. april 2002 - 23:21 Der er 10 kommentarer og
2 løsninger

Kritiske regioner Hvordan gøres det?

Jeg kan ikke få flg. kode til at virke. Metoden skulle udskrive til cout, men da cout ikke er threadsafe, bliver det hele blandet sammen.

void TestPrint::testPrint(char* name){
  CRITICAL_SECTION critSec;

  InitializeCriticalSection(&critSec);
  EnterCriticalSection(&critSec);
   
  cout << "testPrint() begin:  " << name << endl;

  cout << "testPrint() ending: " << name << endl;

  LeaveCriticalSection(&critSec);
  DeleteCriticalSection(&critSec);
}

Jeg kan ikke forstå, hvorfor det ikke virker. I min test laver jeg 3 tråde, som alle får en pointer med til denne metodes objekt. Derved kalder alle tråde den samme funktion.

/Datamaker
Avatar billede wisen Nybegynder
19. april 2002 - 08:25 #1
Jammen du laver jo en ny kritisk sektion hver gang "testPrint" kører. Du skal kun have een, som bliver delt, ellers duer der selvfølgelig ikke...
Avatar billede wisen Nybegynder
19. april 2002 - 08:27 #2
... du kan f.eks. lægge den på klassen. Initiliser der i klassens contructor, og nedlæg den igen i destructoren...
Avatar billede wisen Nybegynder
19. april 2002 - 08:27 #3
Du får lige et svar, at "lege" med :)
Avatar billede datamaker Nybegynder
20. april 2002 - 09:57 #4
Jeg har lavet en MyThread klasse, som skal fungerer som superklasse. Skal jeg skrive CRITICAL_SECTION i headeren som private eller public. Skal den være statisk, således at jeg kun har en sektion i hele min app.? Kan jeg initialiserer/deletes den i superklassen, eller skal den initialiseres/deletes i den pågældende subklasse? Jeg har nemlig prøvet dit forslag, men så får jeg nogle mærkelige fejl.
Avatar billede datamaker Nybegynder
20. april 2002 - 09:59 #5
Jeg beklager den lange reaktionstid, men jeg nåede først til min pc sent i aftes(fredag), og da jeg havde lavet min kommentar, og sendte det. Gik eksperten.dk åbenbart ned. Så det er ikke et tegn på ligegyldighed.
Avatar billede laffe Nybegynder
20. april 2002 - 18:24 #6
Det vil være smartest at erklære din CRITICAL_SECTION global.

Men husk at en CRITICAL_SECTION kun beskytter dig imod, at to forskellige tråde tilgår en eller anden ressource.
Avatar billede datamaker Nybegynder
20. april 2002 - 18:52 #7
Det er også det der er meningen. Jeg skal formegentlig og bruge S/X lock, men skal lige have styr på det basale. For at erklære den global skriver jeg bare:
public:
  static CRITICAL_SECTION cs;
eller hvá?

Med en resource, er det også en funktion?
Avatar billede laffe Nybegynder
20. april 2002 - 19:07 #8
Den skal være global i din unit. Hvis du erklærer den public i thread1, så bliver thread2 jo nød til at kende til thread1.

Sådan vil jeg erklære den:

minfil.h

extern CRITICAL_SECTION cs;

minfil.cpp

CRITICAL_SECTION cs;
Avatar billede datamaker Nybegynder
21. april 2002 - 16:57 #9
nå, jeg kan godt få det til at virke, når jeg kalder initialize ovs. på de enkelte funktioner. Men jeg ville gerne lave én klasse, hvor jeg bare kalder lock eller unlock, uden at "bruger" skal spekulerer på CRITICAL_SECTION. nå, men det kan jeg godt leve med. laffe -> jeg skal lige have wisen til at komme med et svar. Han skal også have lidt point. Jeg vender nok tilbage, for vi er lige begyndt på vores opgave. Men jeg takker for nu.
Avatar billede laffe Nybegynder
21. april 2002 - 17:38 #10
OK
Avatar billede wisen Nybegynder
22. april 2002 - 08:37 #11
1. stk. svar :)
Avatar billede wisen Nybegynder
23. april 2002 - 08:18 #12
Takker for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester