c ++ - Gør std :: tr1 :: shared\_ptr gensidig udelukkelse?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en klasse, som indeholder en BYTE*, en referencetæller og en CRITICAL\_SECTION, der beskytter dem begge mod samtidig adgang.


Jeg vil erstatte alt det med en std::tr1::shared\_ptr<BYTE>. MSDN siger at: [11]



  Flere tråde kan læse og skrive forskellige shared\_ptr objekter på
  på samme tid, selv når objekterne er kopier, der deler ejerskab.



Alt lyder i orden, indtil jeg finder ud af, at CRITICAL\_SECTION fra klassen bruges udenfor for at 'låse' det og ændre indholdet på en gensidigt eksklusiv måde. Okay, det bryder indkapslingen, jeg vil ændre det.


Jeg ved shared\_ptr garanterer, at hukommelsen bliver frigjort, men garanterer den gensidig udelukkelse, når du skriver til hukommelsen?

Bedste reference


Det er op til dig at sikre korrekt adgang til de data, som std::tr1::shared\_ptr peger på. Disse data er din . Det er kun vigtigt for std::tr1::shared\_ptr når det er tid til at slette det.


Med hensyn til selve std::tr1::shared\_ptr objektet har du følgende garantier:



  • Du kan sikkert læse fra samme instans fra flere tråde;

  • Du kan sikkert mutere forskellige forekomster af shared\_ptr fra flere tråde , selvom eksemplerne er kopier (deling af samme referencenummer eller hvad som helst);



Enhver anden samtidig adgang (som læsning og skrivning samtidigt til samme instans ) er udefineret adfærd.


Bemærk også, at shared\_ptr i den nye C ++ 11 standard har en speciel API til atomadgang.