Rückgabewert einer Critical Section

Gast #5212690
Lesenswert?

Hallo Leute,

ich zerbreche mir gerade den Kopf bezüglich einer Crtitcal Section. Also 
ich habe mir so überlegt, dass meine Shared Ressource z.B eine Struktur 
über die Funktion acccess_critical_section() betreten und je nachdem 
gelesen oder beschrieben wird. Innerhalb der Funktion verwende ich 
Semaphoren, damit meine Struktur geschützt ist. Soweit so gut.

Angenommen ich will aus der Struktur lesen. Also rufe ich die Funktion 
mit diesen Paramatern so auf:
1
struc test {..};
2

3
struc test temp;
4

5

6
int main(void){
7
.....
8
}
9

10
static struc test *x (int x){
11

12
Lock;
13

14
//mach irgendwas
15

16
Unlock;
17

18
return &temp; //Genau hier liegt meine Frage
19
}

Ich darf oder sollte beim Lesezugriff auf die Struktur nicht die Adresse 
der Temp - Variable zurück geben sondern sollte eher eine Kopie (Call by 
value) zurückgeben oder?

Also dass die Funktion dann so ausschaut:
1
static struc test x (int x){ //kein Pointer mehr
2

3
Lock;
4

5
//mach irgendwas
6

7
Unlock;
8

9
return temp; //Hier übergebe ich nicht die Adresse sondern die "Kopie"
10
}

Weil meine Überlegung ist, dass wenn ich jetzt die Adresse der 
Strukturvariable zurückgebe, aber im selben Augenblick es zu einem 
Schedule kommt und die Strukturvariable überschrieben wird, würde der 
erste, der den Zugriff hatte falsche Werte bekommen.

Stimmt das eigentlich so ?

Lg
Gast #5212870
Lesenswert?

Vielen dank für die Antwort :)

Wenn ich zwei seperate Funktionen habe also die erste zum beschreiben 
und eines zum lesen der critical section, muss ich beide mit der selben 
mutex schützen oder?
Gast #5212908
Lesenswert?

Das Rückgeben eines Pointers auf eine lokale Variable ist in jedem Fall 
falsch. das ist nicht auf Critical Sections begrenzt. Annahmen darüber 
zu machen, wie der Stack benutzt wird, NACHDEM eine Funktion verlassen 
wurde ist ... (mir fehlen die Worte) sehr sehr Schlecht

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren