ACE에서 Thread Local Storage 사용하기 Programming

Thread Local Storage에 대한 정의는 여기를 참고하시고, 간단히 설명하면 하나의 변수 정의로 스레드별로 고유의 저장 공간을 가질수 있는 방법 입니다. Thread Specific Storage라고도 합니다.

보통
__declspec(thread) int threadIndex;
위와같이 선언해서 사용하는데, primitive data type이 아닌 클래스를 아래와 같이 TLS로 선언하려고 하면 
__declspec(thread) MessageBlockPool tls_pool;
"생성자 또는 소멸자가 있는 개체는 'thread'로 선언할 수 없습니다" 라는 컴파일 에러가 납니다.

하지만, ACE에서는 ACE_TSS<> 를 사용하면 가능합니다.
ACE_TSS<MessageBlockPool> tls_pool;
위와 같이 선언하고 사용할때는 아래와 같이 사용하면 됩니다.
tls_pool->Allocate(size);

전체 소스로 설명을 드리면
class MessageBlockPool
{
public:
    ACE_Message_Block*    Allocate(size_t bufferSize);
};

class MessageBlockPoolRepository
{
public:
    ACE_Message_Block*    Allocate(size_t bufferSize)
    {
        return _pool->Allocate(bufferSize);
    }

private:
    ACE_TSS<MessageBlockPool> _pool;
};

MessageBlockPoolRepository의 _pool의 주소를 찍어보면 모든 스레드에서 같은 주소가 할당되어 있지만, MessageBlockPool의 Allocate함수에 들어가서 this주소를 찍어보면 스레드별로 고유의 공간이 할당되어 있음을 확인할 수 있습니다.


덧글

  • canadian goose 2013/11/19 12:21 # 삭제 답글

    jeg fik et par støvler der var brugt,jeg takker mange gange for den rigtig gode service도움말]
댓글 입력 영역