2016-06-19 6 views
-2

alle: Nach this page C++ - Implementierungen verwendet in der Regel atomare ref count, um Thread-Sicherheit zu gewährleisten, aber dies scheint in einigen Fällen fehlerhaft.C++ shared_ptr Wie gewährleistet man die Thread-Sicherheit?

`` `

void func2(shared_ptr<int>* x) { 
    shared_ptr<int> a(*x); 
    *a += 1; 
} 

thread func1() { 
shared_ptr<int> a1(new int(10)); 
thread t (func2, &a1); 
return t; 
} 

` ``

Wie der obigen Code zeigt an, ob die Kopie Bau in func2 nach dem internen Referenzzähler von a1 verringert geschieht, erhält der Zeiger zweimal gelöscht, Recht?

+7

Das Buggy-Ding hier ist * Ihr * Code ... dangling rohe Zeiger. – deviantfan

Antwort

4

Eine atomare Referenzzahl gewährleistet, dass nur die Referenzzählung threadsicher ist. Die referenzierte Klasse wird nicht in eine threadsichere Klasse umgewandelt. Es hindert Sie nicht daran, thread-unsafe Code zu schreiben, wie einen Zeiger auf einen std::shared_ptr zu einem neuen Thread zu übergeben, aber es zu zerstören, bevor der neue Thread die Möglichkeit hat, eine eigene Kopie davon zu erhalten.

Sie sind immer noch für das Schreiben threadsicherer Logik verantwortlich. Sie können sich jedoch darauf verlassen, dass das Referenzzählen threadsicher ist.