source

클래스 또는 구조 내에서 스레드 로컬 변수를 사용할 수 있습니까?

nicesource 2023. 10. 1. 19:32
반응형

클래스 또는 구조 내에서 스레드 로컬 변수를 사용할 수 있습니까?

이것처럼.

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지정자는 클래스의 전역, 파일 범위 정적, 함수 범위 정적 또는 정적 데이터 멤버에 적용할 수 있습니다.블록 범위 자동 또는 비정전 데이터 멤버에는 적용되지 않을 수 있습니다.

__threadmodifier는 여러 컴파일러에서 지원합니다.정확한 제약이 컴파일러마다 다소 다르다는 것은 상상할 수 없는 일이 아닙니다.

옷을 갈아입어야 합니다.__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 .staticC++의입니다. =벌)입니다 C++는.그래서 운 C11되었습니다 )._Thread_local허락하지 않습니다.이 짐승들은 기본적으로 모든 곳에서 허용됩니다. 정적 저장 기간을 갖는 변수가 허용되었습니다.

의 는 C++ 의은 와 가 있을 수 .static회원님, 하지만 C++11에서 이것을 허락한다면 저는 전혀 모르겠습니다.

합니다.thread_local위해서staticC++의 클래스 또는 구조의 멤버.

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

반응형