2017-01-23 1 views
0

std 라이브러리를 사용하여 응용 프로그램에서 스레드 당 메모리를 예약 할 수 있습니까? 몇 가지 마이크로 스레드를 만들고 싶습니다. 스레드 당 메모리를 예약하는 방법을 알고 싶습니다. 가능한 경우 스레드 용 메모리를 할당하는 것이 가장 좋습니다.C++의 마이크로 스레드

+0

이 표준은 스레드 로컬 메모리를 지원합니다. –

+0

http://en.cppreference.com/w/cpp/language/storage_duration – ildjarn

+0

모든 스레드가 할당 한 메모리는 다른 스레드에서 액세스 할 수 있습니다. 그러나 하나의 쓰레드 만이 메모리에 대한 포인터를 가지고 있다면, 그는 그 쓰레드를 액세스하는 유일한 쓰레드가 될 것이다. 스레드 로컬 메모리는 동일한 함수/객체가 다중 스레드에 의해 액세스 될 때만 필요하며 스레드 당 값을 처리하거나 저장할 필요가 있습니다. – Rene

답변

2

당신이 모든 스레드하지만 같은 포인터와 다른 몇 가지 정적 메모리해야하는 경우 스레드 로컬 저장소를 사용할 수 있습니다

#include <thread> 
#include <iostream> 

static thread_local char thread_name[40]; // on older compilers use __thread 

void thread1() { 
    strcpy(thread_name, "T1"); 

    for (int i = 0; i < 10; ++i) 
     std::cerr << thread_name << ": I'm thread1!\n"; 
} 

void thread2() { 
    strcpy(thread_name, "T2"); 

    for (int i = 0; i < 10; ++i) 
     std::cerr << thread_name << ": I'm thread2!\n"; 
} 

int main() { 
    std::thread t1(thread1), t2(thread2); 
    t1.join(); t2.join(); 
} 

을 ...하거나 새, malloc에로 (동적으로 메모리를 할당 할 수 있습니다 .. ..) 로컬 변수의 thread 함수 내에서, 두 가지 방법으로 다른 스레드가 액세스 할 수 없습니다.

일반적으로 전용 메모리 만 사용하는 함수 또는 모듈을 작성하고 함수/모듈이 인 재진입 코드라고하는 프로그램 상태를 변경하지 않는 경우입니다.

+1

왜 'thread_local' 변수 대신 컴파일러 확장이 필요합니까? – Quentin

+0

맞습니다. GCC 4.4 호환 코드에서 붙여 넣었습니다. 제 대답을 편집했습니다. – gabry

관련 문제