2006-03-22

Active Object Pattern

Active Object Pattern, 일명 능동 객체 패턴은 ACE_Task (ACE), ActiveObject (JAVA), LuaTask (LUA) 등에 적용된 패턴으로, 쓰레드간의 비동기적인 함수 호출을 '''객체지향적으로''' 구현한 패턴이다.

로깅을 담당한 쓰레드에게 비동기적으로 로그를 남기는 함수를 구현한다고 가정해보자.



/// async log
Logger::Log("Hello World!");

void Logger::Log(LPCTSTR msg)
{
m_Queue.Add( new AsyncLog(msg,this) );
}

DWORD Logger::Run()
{
while(true)
{
AsyncWork * pWork = m_Queue.Get();
pWork->Execute();
SAFE_DELETE(pWork);
}
}

class AsyncLog : public AsyncWork {
public :
AsyncLog( LPCTSTR msg, Logger * pLogger )
: m_Message(msg), m_pLogger(pLogger)
{
}
void Execute()
{
m_pLogger->SafeLog(m_Message);
}
};

요청하는 쪽은 로그 쓰레드에서 로그 메써드를 호출토록 하기 위해서 요청을 객체에 넣어서 큐에 삽입하게 되고, 로그 쓰레드는 큐에서 이 객체를 끄집어내어서 관련 메써드를 호출하게 된다. ACE에서는 비동기 함수 호출의 결과를 나타내는 Future 를 지원한다. 이걸 잘 쓰면, 해당 함수 호출이 잘 끝났는지, 결과는 무엇인지 polling 등을 통해서 알아낼 수 있다.

see also :


comments powered by Disqus