Avatar billede tax Nybegynder
24. januar 2002 - 09:26 Der er 7 kommentarer og
2 løsninger

Delt hukommelse

Når man programmerer paralelle tråde der skal kunne kommunikere imellem hinanden, er det nødvendigt at anvende delt hukommelse.

Derfor har jeg oprettet en struct med noge STL køer og et par flag. Dette fungerer iøvrigt også forrygende, men men men.

Hvorfor går det godt. Jeg anvender ikke semaforbeskyttelse eller noget.

Er det fordi at jeg kun anvender en processor, eller fordi at jeg bare er meget heldig? (,og har været det længe - proggy er nemlig stabilt nok)

De lange teoretiske indlæg er meget velkomne, da jeg gerne vil kunne beskrive problemstillingen generelt.

/TAX
Avatar billede jpk Nybegynder
24. januar 2002 - 09:33 #1
Der er fordi du er heldig!
Det faktum at du kun har en processor gør selvfølgelig også at problemet vil opstå mindre hyppigt end hvis du havde flere.
Forestil dig den ene tråd er ved at lave følgende:

1) Læs hvor mange elementer der er i en kø.
2) Slet sidste element (udfra tallet der blev returneret fra operation 1)

Hvis så en anden tråd sletter det sidste element mellem operation 1 og 2...
Avatar billede jpk Nybegynder
24. januar 2002 - 09:33 #2
Har du prøvet at køre i relaese mode?
Avatar billede jpk Nybegynder
24. januar 2002 - 09:35 #3
med mindre selvfølgelig at dine klasser er thread-safe...
Avatar billede chries Nybegynder
24. januar 2002 - 09:49 #4
STL er ikke threadsafe, så jeg vil sige du bare er heldig. du kan læse med flere samtidlig.

http://www.sgi.com/tech/stl/thread_safety.html
http://www.mvps.org/vcfaq/lang/8.htm

The SGI implementation of STL is thread-safe only in the sense that simultaneous accesses to distinct containers are safe, and simultaneous read accesses to to shared containers are safe. If multiple threads access a single container, and at least one thread may potentially write, then the user is responsible for ensuring mutual exclusion between the threads during the container accesses.

This is the only way to ensure full performance for containers that do not need concurrent access. Locking or other forms of synchronization are typically expensive and should be avoided when not necessary.
Avatar billede tax Nybegynder
24. januar 2002 - 10:30 #5
Jeg tror jeg er heldig, fordi at der altid kun er en tråd der checkker køstørrelse, for derefter at hente fra køen. Derfor vil indholdet altid være det den læser. Phew.

Med hensyn til hvilke data der skal beskyttes har jeg ladet mig fortælle at det har noget at gøre med størrelsen af data.

Hvis data er så stor at CPU skal læse flere gange (variablen fylder mere end CPU's bitstørrelse), kan man risikere at en anden tråd opererer på data og den første tråd læser et underligt resultat.

Jeg tror det kaldes beskyttelse af helheden i data?
Avatar billede Slettet bruger
24. januar 2002 - 10:45 #6
I princippet er det vel ikke nødvendigt at bruge delt hukommelse når du bruger tråde, da de er "født" med et delt adresserum.
Avatar billede chries Nybegynder
24. januar 2002 - 10:51 #7
Data der opdateres med en instruktion behøver ikke beskyttes med henhold til dens integritet. Men hvis du skal bruge dens værdi/indhold flere gange, uden at den må ændre værdi (modificeres af en anden tråd) skal du beskytte den.
Avatar billede jpk Nybegynder
24. januar 2002 - 10:54 #8
tax:
Jeg tror næppe det har noget at gøre med "CPU's bitstørrelse"...

Det er dog nok tilfældet at det er en så lille mængde operationer, at de alle kan udføres før tråden mister sin time-slice på CPU'en!
Det er dog ingen garanti at dette altid er således og varierer alt efter operativsystem.
Avatar billede chries Nybegynder
24. januar 2002 - 10:55 #9
mens:
int temp = ubeskyttet_int;
temp += 1;
return temp; // returner hvad ubeskyttet_int + 1 var i øjebilkket den blev læst

går godt, vil du med:
ubeskyttet_int = 0;
ubeskyttet_int += 1;
return ubeskyttet_int;

ikke være sikker på det er 1 den returner.
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