2010-05-16 6 views
11

ich das las: http://en.wikipedia.org/wiki/Thread_safetyThread-Sicherheit mit Heap-Speicher zugewiesen

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 thread-safe Sie nur Variablen aus dem Stapel verwenden können. "Ja wirklich?" Warum? Würde nicht nachfolgenden Aufrufen der oben genannten Funktionsspeicher an anderer Stelle zuweisen?

Edit: Ah. Sieht wie ich diesen Teil des Artikels misread:

Ein Unterprogramm ist einspringende und damit threadsicher, wenn

  • die einzigen Variablen aus dem Stapel verwendet sind

(ich nahm es zu

Ein Unterprogramm ist reentrant und damit threadsicher, wenn und nur dann, wenn

  • die einzigen Variablen, es sind vom Stapel

, die im Folgenden nach den Antworten verwendet, nicht der Fall ist)

+9

Verwenden Sie 'löschen []' für Arrays nicht 'löschen' –

+0

@Brian: Woops - danke. Ich fügte den Array-Teil hinzu, nachdem ich die Funktion bereits eingegeben hatte, um deutlich zu machen, dass ich Speicher dynamisch zuordnete, vergaß aber, die [] 's hinzuzufügen. +1 :) – Cam

+1

Es ist erstaunlich, die Verbreitung von Wikipedia als Referenz für die Programmierung von Konzepten zu sehen :) – ch0kee

Antwort

10

Wenn Sie in einer Umgebung Codierung, die Multi-Threading unterstützt, dann können Sie sicher sein ziemlich sicher, dass new ist Thread-sicher.

Obwohl der Speicher auf dem Haufen ist, ist der Zeiger auf sie auf den Stapel. Nur Thread hat den Zeiger auf diesen Speicher, und so besteht keine Gefahr der gleichzeitigen Veränderung - kein anderer Thread weiß, wo der Speicher, ihn zu ändern ist.

Sie würden nur ein Problem mit Thread-Sicherheit, wenn man diesen Zeiger auf einen anderen Thread passieren waren, die gleichzeitig ändern würde dann diesen Speicher zur gleichen Zeit wie das Original (oder einem anderen) Gewinde.

+0

Danke. Schwierige Wahl zwischen Ihrer Antwort und Peters, aber Ihr hilfreicher Hinweis am Ende war relevant, während er über Vektoren war :) – Cam

0

neu und löschen kann oder möglicherweise nicht threadsicher. Sie sind wahrscheinlich, aber das ist abhängig von der Implementierung. Siehe: C++ new operator thread safety in linux and gcc 4

Um threadsicher zu sein, muss eine Funktion entweder Stapelvariablen verwenden oder ihren Zugriff auf andere Ressourcen mit anderen Threads synchronisieren. Solange getrennte Anrufe neu auf dem Heap anderen Raum zuzuweisen, wenn aus verschiedenen Threads aufgerufen, sollten Sie in Ordnung sein.

2

Es sagt nicht nur Stack-Variablen verwenden können, heißt es, dass Heap-Variablen „die Notwendigkeit einer sorgfältigen Prüfung schlägt vor, zu sehen, ob es sicher ist“.

new und delete sind normalerweise threadsafe implementiert (nicht sicher, dass der Standard das aber garantiert), also wird Ihr Code oben wahrscheinlich in Ordnung sein.

plus üblichen Empfehlungen von std::vector anstelle von manuell ein Array Zuweisung, aber ich nehme an, Sie sofern nur als Beispiel :)

+1

Ich erinnere mich an den Betrieb in einer Umgebung, wo sie nicht waren. Jetzt * das * war haarig. – Joshua

+1

Es ist ein Glück, dass Sie sie dann überschreiben können :) –