Frage

Themen in Perl standardmäßig nehmen ihren eigenen lokalen Speicher für alle Variablen, die Auswirkungen von Threads auf dem bestehenden nicht-Thread-aware Code zu minimieren. In Perl, ein Thread-Umgebungsvariable kann mit einem Attribute erstellt werden:

use threads;
use threads::shared;

my $localvar;
my $sharedvar :shared; 

HP-UX Runtime Loader dynamische Belastung von Shared Libraries nicht unterstützt, die (TLS) Thread-Lokalspeicher enthalten.
Als Ergebnis, wenn auf den Importmodule versuchen, die TLS enthält die folgenden Fehler gemeldet:

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

Also ich weiß, warum ich eine Störung erhalte bin ich nur unklar, warum es schwierig sein würde, eine Bibliothek mit TLS zu laden?

War es hilfreich?

Lösung

Die Art und Weise TLS Speicherung eingestellt ist auf dem TLS-Zugriff hängt bis Modell .

In dem einfacheren „Initial ausführbaren / statischen TLS“ -Modell, setzt der Lader TLS-Segment, bevor der erste Befehl der Haupt ausführbaren Datei ausgeführt wird. Es berechnet die Größe dieses Segments durch Aufsummierung TLS Anforderungen der wichtigsten ausführbare Datei und alle gemeinsam genutzten Bibliotheken direkt abhängt.

Sobald dieser TLS-Segment zugeordnet und eingerichtet, startet die Anwendung ausgeführt wird, und kann auch speichern Zeiger in das TLS-Segment. Daher ist es unmöglich, Speicher für das Segment realloc() -. Der Lader würde keine Ahnung hat, die in der Anwendung Zeiger müssen aktualisiert werden,

Da Sie das Segment nicht realloc können, und da es keinen Platz darin für zusätzliche Variablen; wie kann Deal mit dynamisch geladenen Bibliotheken Loader, die TLS Speicherung ihrer eigenen erfordern?

Die glibc loader ordnet tatsächlich etwas mehr Platz in der Anfangs TLS, und so ist es können dynamisch laden Bibliotheken mit TLS, sofern sie nicht zu viel Raum nutzen. Sobald diese Reserve aufgebraucht ist, wird auch glibc loader verweigert zusätzliche Bibliotheken mit TLS Anforderungen zu laden.

Unter Solaris und Linux ist es möglich, dynamisch Bibliotheken mit beliebigen TLS Anforderungen zu laden, die unter Verwendung von „General Dynamische TLS Modell ".

Es sieht aus wie HP-UX v1.6 auch unterstützt dass das Modell und in der Tat macht es die Standardeinstellung. Aber Sie sind wahrscheinlich eine ältere Betriebssystem-Version ausgeführt wird, wo dieses Modell nicht der Standard ist, und kann nicht unterstützt werden. Überprüfen Sie, ob Ihre Compiler-Version +tls=dynamic Option unterstützt, und wenn ja, ob mit ihrem Aufbau hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top