문제

스레드에서 펄 기본적으로 자신의 로컬 저장소에 대한 모든 변수에 미치는 영향을 최소화하기 위해 스레드에서 기존 non-thread-aware 코드입니다.In Perl,스레드 공유 변수를 사용하여 만들 수 있습니다 속성:

use threads;
use threads::shared;

my $localvar;
my $sharedvar :shared; 

HP-UX runtime loader 지원하지 않는 동적 부하 공유 라이브러리를 포함하는(TLS)스레드 로컬 저장소입니다.
결과적으로 시도할 때를 가져오는 모듈을 포함 TLS 다음과 같은 오류 보고:

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

그래서 나는 이유를 알고 나는 오류 난 그냥 불분명 한 이유는 것은 어려울을 로드하는 라이브러리와 함께 TLS?

도움이 되었습니까?

해결책

방법 TLS 관이 설정에 따라 달라집 TLS 액세스 모델.

에서 간단한"처음 실행/정적 TLS"모델,로더 설정 TLS 세그먼트를하기 전에 첫번째 지시의 주요 실행이 실행됩니다.계산의 크기는 세그먼트까지 추가하여 TLS 요구사항의 주요 실행과 공유 라이브러리를 직접에 따라 달라집니다.

이 TLS 세그먼트는 할당을 설정,응용 프로그램이 실행되기 시작하고 있습니다 잘 저장소의 포인터로 TLS 세그먼트입니다.따라서 그것은 불가능하기 realloc() 저장소에 대한 세그먼트--로더가 아무 생각이 없는 포인터에서 응용 프로그램 업데이트해야 합니다.

할 수 없기 때문에 realloc 세그먼트가 없기 때문에 공간에 대한 추가적인 변수를;할 수 있는 방법 로더가 다루는 동적으로 읽어 라이브러리를 필요로 하는 TLS 관의 자신?

Glibc 로더가 실제로 할당하는 몇 가지 여분의 공간에서 초기 TLS,그리고 그것은 동적으로 로드 라이브러리와 함께 TLS 를 제공해 그들이 너무 많이 사용하지 않는 공간입니다.이 예약이 소진되고,glibc 로더는 것을 거부하는 부하를 추가 라이브러리와 함께 TLS 요구 사항입니다.

Solaris 와 Linux 가능하여 부하를 동적으로 라이브러리를 임의 TLS 요구 사항을 사용하여"일반적인 동적 TLS 모델".

그것처럼 보이는 HP-UX v1.6 지원 는 모델,그리고 사실 그것이 기본입니다.하지만 당신은 아마 실행하는 오래된 OS 릴리스,이 모델은 기본적으로 지원되지 않을 수 있습니다.체크인 경우 컴파일러 버전 지원 +tls=dynamic 옵션,그리고 그렇다면 여부 건물과 함께 그것은 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top