클래스 또는 구조 내에서 스레드 로컬 변수를 사용할 수 있습니까?
이것처럼.
struct some_struct
{
// Other fields
.....
__thread int tl;
}
그렇게 하려고 하는데 컴파일러에서 오류가 나요.
./cv.h:16:2: error: '__thread' is only allowed on variable declarations
__thread int tl;
C 및 C++에서 스레드 로컬 저장은 정적 변수 또는 외부 링크가 있는 변수에만 적용됩니다.
로컬(자동) 변수는 일반적으로 스택에서 생성되므로 코드를 실행하는 스레드에 고유하지만 전역 및 정적 변수는 데이터 또는 BSS 세그먼트에 상주하므로 모든 스레드에서 공유됩니다.TLS는 이러한 전역 변수를 스레드에 로컬로 만드는 메커니즘을 제공합니다.__thread
키워드 달성 - 컴파일러가 사전적으로 전역 또는 정적으로 유지되는 동안 각 스레드에서 변수의 별도 복사본을 생성하도록 지시합니다(예: 동일한 실행 스레드 내에서 호출되는 다른 함수로 액세스할 수 있음).
비정규 클래스 멤버 및 구조 멤버는 개체(클래스 또는 구조)가 할당된 위치에 배치됩니다(자동 변수가 선언된 경우 스택 또는 힙).new
아니면malloc()
사용됩니다.어느 쪽이든, 각 스레드는 변수에 대한 고유한 저장 위치를 수신하고,__thread
이 경우에는 해당되지 않으므로 컴파일러 오류가 발생합니다.
gcc
사용에 다음과 같은 제한을 가합니다.__thread
:
그
__thread
지정자는 클래스의 전역, 파일 범위 정적, 함수 범위 정적 또는 정적 데이터 멤버에 적용할 수 있습니다.블록 범위 자동 또는 비정전 데이터 멤버에는 적용되지 않을 수 있습니다.
그__thread
modifier는 여러 컴파일러에서 지원합니다.정확한 제약이 컴파일러마다 다소 다르다는 것은 상상할 수 없는 일이 아닙니다.
옷을 갈아입어야 합니다.__thread int tl;
로.thread_local static int tl;
C11 표준 섹션 6.7.1 단락 2
_Thread_local이 static 또는 extern.120)과 함께 나타날 수 있는 경우를 제외하고, 선언의 선언 지정자에는 최대 하나의 스토리지 클래스 지정자가 지정될 수 있습니다.
C11 표준 섹션 6.7.1 제3항
블록 범위가 있는 객체의 선언에서 선언 지정자가 _Thread_local을 포함하는 경우 정적 또는 외부도 포함해야 합니다.개체의 선언에 _thread_local이 나타나면 해당 개체의 모든 선언에 표시됩니다.
Petzold의 오래된 책 'Programming Windows'(1241페이지)에 따르면 키워드 __declspec(실)을 사용하여 변수를 스레드 로컬로 표시합니다.따라서 예를 들어 iGlobal = 1의 __declspec(thread);
수업시간에 할 수 있을지는 의문입니다.변수를 정적으로 만들 수도 있습니다.[edit] 방금 당신이 윈도우에서 실행되고 있지 않다는 것을 깨달았습니다.그래서 저는 윈도우 답변이 필요한 사람들에게는 이것이 관련이 있을 수 있다고 생각합니다.
이렇게 적습니다.
template <class T> struct S {
thread_local static int tlm;
};
template <> thread_local int S<float>::tlm = 0; // "static" does not appear here
https://en.cppreference.com/w/cpp/language/storage_duration 에 나와 있는 바와 같이
구조물 자체를 스레드 로컬로 지정할 수도 있습니다.예를 들어,
#include <pthread.h>
thread_local struct gl_i_t{
int a;
int b;
}GL_i_t;
그러면 스레드 내부에 GL_i_t 변수를 사용할 수 있습니다.
가 없습니다. C .static
C++의입니다. =벌)입니다 C++는.그래서 운 C11되었습니다 )._Thread_local
허락하지 않습니다.이 짐승들은 기본적으로 모든 곳에서 허용됩니다. 정적 저장 기간을 갖는 변수가 허용되었습니다.
의 는 C++ 의은 와 가 있을 수 .static
회원님, 하지만 C++11에서 이것을 허락한다면 저는 전혀 모르겠습니다.
합니다.thread_local
위해서static
C++의 클래스 또는 구조의 멤버.
struct some_struct
{
// Other fields
.....
thread_local static int tl;
}
이 정도면 괜찮을 거예요. 그래서.some_struct::tl
서로 다른 스레드에서 다른 값을 가질 수 있습니다.다를 .thread_local
시:
thread_local int some_struct::tl = 10;
언급URL : https://stackoverflow.com/questions/10999131/can-you-use-thread-local-variables-inside-a-class-or-structure
'source' 카테고리의 다른 글
wo commerce in word press return 항상 단순한 제품 유형 (0) | 2023.10.01 |
---|---|
PL/SQL에 해시 함수가 있습니까? (0) | 2023.10.01 |
CSS에서 자녀에게 부모의 곡선 경계선을 지키도록 강요 (0) | 2023.10.01 |
"네트워크 서비스" 계정을 위해 파워셸에서 윈도우 서비스를 만드는 방법은? (0) | 2023.10.01 |
목록 이해:각 항목에 대해 두 개 이상의 항목 반환 (0) | 2023.10.01 |