WideStudio/MWT Logo
WideStudio/MWT
Programming Guide
WideStudio/MWT Index
Table of contents


범용 쓰레드 / 세마포어 / 뮤텍스



범용 쓰레드 클래스를 사용하는 쓰레드 생성

WSDthread 클래스를 이용하먼, 프로그램위에서 쓰레드를 생성할 수 있습니다

btnop() 함수가 버튼 클릭등 이벤트에 의해 실행될 이벤트 프로시저 본체입니다. 그 이벤트 프로시저위에서 WSDthread 클래스의 인스턴스를 생성하고, 쓰레드로서 실행하고싶은 함수 thread_func()를 기술하면, 쓰레드가 생성됩니다. 그리고 쓰레드로서 동작하는 thread_func()위에서, execCallback() 멤버 함수를 사용하면 부모 쓰레드에 이벤트를 전달할 수 있습니다. execCallback() 멤버 함수를 호출하면, 부모 쓰레드위에서, setCallbackFunction() 멤버 함수에서 기술된 콜백 함수가 동작해서, 쓰레드와 부모 쓰레드사이 동기 처리를 할 수 있습니다.

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
WSDthread* thr = NULL;

//자식 쓰레드로서 실행할 함수를 정의
void* thread_func(WSDthread* obj,void* ptr){
  long cnt= (long)ptr;
  while(1){
	cnt++;
	obj->execCallback((void*)cnt); //부모 쓰레드에 전달
#ifdef MSW
	Sleep(1000);
#else
	sleep(1);
#endif
  }
  return NULL;
}

//쓰레드에서 전달되어서, 부모 쓰레드에서 실행될 콜백 함수
void callback_func(WSDthread*,void* val){
  long cnt = (long)val;
  //증가된 숫자를 표시합니다.
  newvbtn_000->setProperty(WSNlabelString,cnt);
}

//이벤트 프로시저. 버튼 클릭등 이벤트로 실행.
void btnop(WSCbase* object){
  if (thr == NULL){
	thr = WSDthread::getNewInstance();
	thr->setFunction(thread_func);
	thr->setCallbackFunction(callback_func);
	thr->createThread((void*)100);
  }else{
	exit(0);
  }
}

createThread() 멤버 함수에 의해 기동뒨 쓰레드 내부에서는, 부모 쓰레드와 동기하지 않는 자식 쓰레드로서 동작하기 때문에, 쓰레드에 대해서는 안전하지 않는 WideStudio의 GUI 인스턴스를 배타제어 없는 채 접근하지 마십시오. WideStudio의 GUI 인스턴스에서 쓰레드안에서 처리한 결과를 표시시키고 싶을 경우는, 쓰레드 인스턴스에 execCallback() 멤버 함수를 사용해서, 부모 쓰레드에 전달할 방법을 쓰고, 부모 쓰레드위에서 표시 처리를 하면 좋습니다.

뮤텍스

뮤텍스를 쓰면, 복수의 쓰레드가 동작하는 코드에 대해서, 동시에 하나 쓰레드 밖에 동작하지 않도록, 배타재어할 수 있습니다. 아래 예제에서는, 범용 쓰레드를 써서 생성뒨 복수 쓰레드가 실행중, 동시에 복수 실행하면 안된 처리에 대해서, 뮤텍스를 사용해서 배타를 걸린 것입니다.


#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
#include <WSDthread.h>
#include <WSDmutex.h>
#include <stdlib.h>
#include <unistd.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
#include <newwin000.h>
WSDmutex* mutex = NULL;
static long cnt=0;

//복수의 자식 쓰레드로서 실행할 함수를 정의
void* thread_func(WSDthread* obj,void*){
  while(1){
	mutex->lock();
	cnt++;
	obj->execCallback((void*)cnt); //부모 쓰레드에 전달
#ifdef MSW
	Sleep(1000);
#else
	sleep(1);
#endif
	mutex->unlock();
  }
  return NULL;
}

//쓰레드에서 전달되어서, 부모 쓰레드에서 실행할 콜백 함수
void callback_func(WSDthread*,void* val){
  long cnt = (long)val;
  //증가된 숫자를 표시합니다.
  newvbtn_000->setProperty(WSNlabelString,cnt);
}

//이벤트 프로시저. 버튼 클릭등 이벤트로 실행.
void btnop(WSCbase* object){
  //do something...
  if (mutex == NULL){
	//배타를 걸기 위해서, 뮤텍스를 생성시킵니다.
	mutex = WSDmutex::getNewInstance();
	mutex->initialize();

	//동시에 10개 쓰레드를 생성하고, 숫자를 증가합니다.
	long i;
	for(i=0; i<10; i++){
	  WSDthread* thr = WSDthread::getNewInstance();
	  thr->setFunction(thread_func);
	  thr->setCallbackFunction(callback_func);
	  thr->createThread((void*)0);
	}
  }else{
	exit(0);
  }
}
static WSCfunctionRegister op("btnop",(void*)btnop);



세마포어

세마포어를 사용하면, 뮤텍스와 같은 배타제어, 및 복수 쓰레드가 협조 동작하기를 위해서 대기 처리를 할 수 있습니다. 아래 사용 예제는, 범용 쓰레드를 써서 생성된 쓰레드에 대해서, 세마포어를 사용해서 대기를 합니다. 버튼을 한번 클릭하면, 쓰레드를 생성하고, 세마포어를 사용해서 쓰레드를 대기시킵니다. 2번째 클릭으로 세마포어를 해제하고, 대기하였던 쓰레드를 동작를 개시시킵니다.

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
#include <WSDthread.h>
#include <WSDsemaphore.h>
#include <stdlib.h>
#include <unistd.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
#include <newwin000.h>
WSDsemaphore* sem = NULL;
static long cnt=0;

//쓰레드로서 동작할 함수입니다.
void* thread_func(WSDthread* obj,void* val){
  sem->lock(); //세마포어에 의해 다기합니다.
  while(1){
	obj->execCallback((void*)cnt);
#ifdef MSW
	Sleep(1000);
#else
	sleep(1);
#endif
	cnt++;
  }
  return NULL;
}

//쓰레드에서 전달되어서, 부모 쓰레드에서 실행할 콜백 함수
void callback_func(WSDthread*,void* val){
  long cnt = (long)val;
  //증가된 숫자를 표시합니다.
  newvbtn_000->setProperty(WSNlabelString,cnt);
}

//이벤트 프로시저. 버튼 클릭등 이벤트로 실행.
void btnop(WSCbase* object){
  //do something...
  if (sem == NULL){
	//세마포어를 작성합니다.
	sem = WSDsemaphore::getNewInstance();
	sem->initialize();
	sem->lock();

	//쓰레드를 생성합니다.
	WSDthread* thr = WSDthread::getNewInstance();
	thr->setFunction(thread_func);
	thr->setCallbackFunction(callback_func);
	thr->createThread((void*)0);
	object->setProperty(WSNlabelString,"Start Thread");
  }else{
	//2번째 실행시에 세마포어를 해제하고, 대기하였던 쓰레드를 동작시킵니다.
	sem->unlock(); //start the waiting thread.
  }
}
static WSCfunctionRegister op("btnop",(void*)btnop);


Document Release 3.90 for WideStudio/MWT ver 3.90, Jul 2005


WideStudio/MWT documents index | Table of contents

Copyright(C) WideStudio/MWT Development Team, 1999-2005 Last modified: Jul 31, 2005