Thread-Sicherheit mit heap-Speicher reserviert
Las ich dies: http://en.wikipedia.org/wiki/Thread_safety
Ist die folgende Funktion thread-sicher?
void foo(int y){
int * x = new int[50];
/*...do some stuff with the allocated memory...*/
delete [] x;
}
In dem Artikel heißt es, dass werden, um thread-sicher können Sie nur Variablen vom stack. Wirklich? Warum? Würde nicht nachfolgende Aufrufe der obigen Funktion allocate memory anderswo?
Edit: Ah. Sieht aus wie ich falsch verstanden, dieser Teil des Artikels:
Ein Unterprogramm ist reentrant, und somit thread-sicher, wenn
- die einzigen Variablen, die Sie verwendet sind aus dem Stapel
(Ich nahm es bedeuten,
Ein Unterprogramm ist reentrant, und somit thread-sicher, wenn und nur, wenn
- die einzigen Variablen, die Sie verwendet sind aus dem Stapel
die nach den Antworten unten, ist nicht der Fall)
- Verwenden
delete[]
für arrays nichtdelete
- Woops - vielen Dank. Ich habe den array-Teil, nachdem ich hatte bereits geschrieben, die Funktion, bei der es ganz klar, dass ich dynamisch reservieren von Speicher, aber vergaß hinzuzufügen, die []'s. +1 🙂
- Es ist erstaunlich zu sehen, die Verbreitung der Nutzung von wikipedia als Referenz für Programmierung Konzepte 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie die Kodierung in einer Umgebung, die multi-threading unterstützt, dann können Sie ziemlich sicher sein
new
ist thread-sicher.Obwohl der Speicher auf dem heap, der Zeiger darauf auf den stack. Nur dein thread hat den Zeiger auf diesen Speicher, und so gibt es keine Gefahr von concurrent-modification - keinen anderen thread weiß, wo der Speicher ist, um es zu ändern.
Erhalten Sie nur ein problem mit der thread-Sicherheit, wenn Sie übergeben Sie diesen Zeiger auf einen anderen thread, der würde dann gleichzeitig geändert werden diese Speicher in der gleichen Zeit wie das original (oder einem anderen) thread.
Es nicht sagen, können Sie nur verwenden, stack-Variablen, es sagt, dass die heap-Variablen ", schlägt die Notwendigkeit für eine sorgfältige Untersuchung, um zu sehen, wenn es unsicher ist".
new
unddelete
sind normalerweise durchgeführt in einem threadsicher Weg (nicht sicher, dass der standard garantiert, dass, obwohl), damit der code oben wird wahrscheinlich in Ordnung sein.Plus üblichen Empfehlungen mit
std::vector
anstelle der manuellen Zuweisung zu einem array, aber ich nehme Sie nur als Beispiel 🙂new und delete sein kann oder nicht thread-sicher. Sie sind wahrscheinlich, aber das ist von der Implementierung abhängig. Siehe:
C++ operator new thread-Sicherheit in linux und gcc 4
Werden, um thread-safe, eine Funktion muss entweder stack-Variablen oder synchronisieren Sie den Zugriff auf andere Ressourcen mit anderen threads. Solange separate Aufrufe von new reservieren verschiedenen Speicherplatz auf dem heap wenn man aus verschiedenen threads, Sie sollten in Ordnung sein.