2009-04-30 8 views
1

Threads in Perl verwenden standardmäßig ihren eigenen lokalen Speicher für alle Variablen, um die Auswirkung von Threads auf vorhandenen Code ohne Threads zu minimieren. In Perl, ein gewinde gemeinsam benutzte Variable kann unter Verwendung eines Attribut-erstellt werden:Warum würde shl_load() für Bibliotheken mit lokalem Threadspeicher fehlschlagen?

use threads; 
use threads::shared; 

my $localvar; 
my $sharedvar :shared; 

HP-UX Runtime Loader dynamische Belastung von gemeinsam benutzten Bibliotheken, die nicht unterstützt (TLS) Thread-Lokalspeicher enthält.
Als Ergebnis beim Versuch, Module zu importieren, die TLS der folgende Fehler enthalten wird berichtet:

 
"/usr/lib/dld.sl: Can't shl_load() a library containing Thread Local Storage" 

So weiß ich, warum ich einen Fehler bekomme ich bin nur unklar, warum es schwierig sein würde, laden eine Bibliothek mit TLS?

Antwort

2

Die Art und Weise, wie der TLS-Speicher eingerichtet wird, hängt vom TLS-Zugriff model ab.

Im einfacheren Modell "Initial executable/static TLS" richtet der Loader das TLS-Segment ein, bevor die erste Anweisung der Hauptdatei ausgeführt wird. Es berechnet die Größe dieses Segments, indem es die TLS-Anforderungen der Hauptdatei und aller gemeinsam genutzten Bibliotheken, von denen sie direkt abhängt, aufaddiert.

Sobald dieses TLS-Segment zugewiesen und eingerichtet ist, wird die Anwendung gestartet und kann möglicherweise Zeiger in das TLS-Segment speichern. Daher ist es unmöglich, realloc() Speicher für das Segment - der Lader hätte keine Ahnung, welche Zeiger in der Anwendung aktualisiert werden müssen.

Da Sie das Segment nicht neu zuordnen können, und da für zusätzliche Variablen kein Platz darin ist; Wie kann loader mit dynamisch geladenen Bibliotheken umgehen, die TLS-Speicher benötigen?

Der Glibc-Lader weist tatsächlich im ersten TLS zusätzlichen Speicherplatz zu, sodass er Bibliotheken dynamisch mit TLS laden kann, sofern sie nicht zu viel Speicherplatz belegen. Sobald diese Reserve erschöpft ist, wird glibc loader auch keine weiteren Bibliotheken mit TLS-Anforderungen laden.

Unter Solaris und Linux ist es möglich, Bibliotheken mit beliebigen TLS-Anforderungen dynamisch zu laden. Verwenden Sie dazu das "Allgemeine dynamische TLS model".

Es sieht aus wie HP-UX v1.6 auch supports dieses Modell, und tatsächlich macht es zum Standard. Aber Sie führen wahrscheinlich eine ältere Betriebssystemversion aus, wobei dieses Modell nicht der Standard ist und möglicherweise überhaupt nicht unterstützt wird. Überprüfen Sie, ob Ihre Compiler-Version Option unterstützt, und wenn ja, ob das Bauen mit ihm hilft.