잊지 않겠습니다.

'Win32 API'에 해당되는 글 2건

  1. 2009.01.07 Open MP 사용 - Visual Studio 2005 이상
  2. 2009.01.07 Object Threading

 #pragma omp parallel

{

    printf("Hello World ");

}

함수로 묶을 필요도 없고, 따로 프로시져로 떼어 놓고 쓸 필요도 없이 어디서나 OpenMP 지시어와 저렇게 블럭으로 묶으면 그 블럭에 해당되는 행위들이 쓰레드로 나뉘어서 표현을 하게 됩니다. 이렇게 하면 P4-HT 기술이 적용된 CPU에서는 위의 문장을 최소 두번 이상 실행하게 되지요. 또한 위와 같은 단순히 행위에만 관련된 병렬처리만 있는게 아닌, 값을 나눠서 처리하는 병렬처리도 가능하게 되었습니다.

#pragma omp parallel for for(int i = 1; i < 100 ; ++i)     x[i] = (y[i-1] + y[i+1])/2;

위와 같은 문장에서는 만일 프로세서가 4개라면, 첫번째 프로세서에서는 1부터 25까지의 연산을, 두번째 프로세서는 26부터 50까지, 이런 식으로 루프를 4개로 나누어서 프로세서 별로 처리 하게끔 합니다. 최적화의 기본중에 하나인 loop unrolling 방식을 아주 쉽게 표현 할 수 가 있게 되었습니다. 이외에도 여러가지 것들이 있는데, 보통은 쓰레드 하고 말을 하면 언제나 싱크 문제에 대해서 많이 걱정을 하게 됩니다. 그러나 아주 쉽게 여길 정도로 크리티컬 색션과 같은 항목을 위 처럼 간단한 pragma 세팅 만으로 처리 가능하도록 되어 있으니 너무 걱정 않해도 될 정도 입니다.

Posted by Y2K
,

Object Threading

OS 자료들 2009. 1. 7. 13:10

스레드 Windows API 함수를 클래스로 래퍼(Wrapper)해서 쓰는 방법에 대해 소개하겠습니다. MFC에 있는 객체 스레드에서 워커 스레드로 구현할 때 MFC 객체 스레드는 너무 무겁게 느껴질 것입니다. 그 대안으로 객체 스레드를 구성해 보았습니다. 이 스레드는 워커 스레드용으로써, 이 스레드를 잘 활용하면 가장 깔끔하고 간단하면서도 강력하게 구현될 것입니다.

  객체 스레딩 기법의 재사용성에 맞추어 구현해 보도록 하겠습니다. 기반 클래스(Base Class)를 CThread라고 가정하고 다음과 같이 구현합니다.

  객체 스레딩 기법의 객체 스레드 선언 부분은 다음과 같다.

class CThread 
{
public:
    CThread();
    virtual ~CThread();

    virtual void Create();
    virtual void Stop();

    BOOL IsRunning() { return m_hThread != NULL; } const

    virtual DWORD OnThreadProc() = 0;
    static DWORD WINAPI ThreadProc(LPVOID lpParam);

    static int GetRefCount() { return m_nRef; } const
    int GetIndex() { return m_nIndex; } const

protected:
    HANDLE m_hThread;
    DWORD m_dwThreadId;

private:
    static int m_nRef;
    int m_nIndex;
};

  

  

int CThread::m_nRef = 0;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CThread::CThread()
{
    m_nIndex = m_nRef++;

    m_hThread = NULL;
    m_dwThreadId = 0;
}

CThread::~CThread()
{
    m_nRef--;
}

//////////////////////////////////////////////////////////////////////
// Implementation
//////////////////////////////////////////////////////////////////////
void CThread::Create()
{
    m_hThread = ::CreateThread(0, 0, ThreadProc, this, 0, &m_dwThreadId);
}

void CThread::Stop()
{
    while (::WaitForSingleObject(m_hThread, 0) != WAIT_OBJECT_0)
        Sleep(50);

    CloseHandle(m_hThread);
    m_hThread = NULL;
    m_dwThreadId = 0;
}

DWORD WINAPI CThread::ThreadProc(LPVOID lpParam)
{
    CThread *pThread = (CThread *)lpParam;
    ::ExitThread(pThread->OnThreadProc());
    return 0;
}

  

이제 객체 스레드의 선언과 정의 부분을 구현하였고, 이 기반 클래스(Base Class)로부터 상속받아 예제 프로그램을 작성해 보도록 하겠습니다. 다음의 예제 프로그램은 파일을 삭제하는 객체 스레드입니다.

class CDeleteFileThread : pulbic CThread
{
public:
    CDeleteFileThread();
    virtual ~CDeleteFileThread();

    void SetPath(LPCTSTR);

protected:
    virtual DWORD OnThreadProc();
   
protected:
    TCHAR m_szPath[MAX_PATH];
};

CDeleteFileThread::CDeleteFileThread()
{
    memset(m_szPath, 0, MAX_PATH*sizeof(TCHAR));
}

CDeleteFileThread::~CDeleteFileThread()
{
}

void CDeleteFileThread::SetPath(LPCTSTR lpcszPath)
{
    _tcscpy(m_szPath, lpcszPath);
}

DWORD CDeleteFileThread::OnThreadProc()
{
    SHFILEOPSTRUCT shfo = {0};
    shfo.wFunc = FO_DELETE;
    shfo.pFrom = m_szPath;
    SHFileOperation(&shfo);

    return 0;
}

  

Posted by Y2K
,