본문 바로가기
프로그래밍/Windows API

Windows 와 Linux Thread Control 함수 비교 (동기화 함수)

by 호군 2010. 10. 27.
반응형

Preface
Windows 프로그램을 리눅스로 포팅을 할때 가장 문제가 되는 것은 프로세스 쓰레드 관련 함수와 각종 IPC들이다. 소켓이나 기본적인 함수들은 모두 같이 사용이 되거나 용례가 비슷한데 반해서 이들은 완전히 독립적으로 동작이 되기 때문에 설계 자체를 바꿔야 하는 경우도 있다. 이를 좀더 쉽게 하기 위해서 각각에 대해서 어떻게 포팅을 해야 하는지를 정리해 보았다.




Process & Thread
Windows와 Linux가 process와 thread에 관련된 내부적 구조체 및 동작 방식은 완전히 다르다. 하지만, 이들을 조작하는 함수에는 거의 차이가 없다. 함수에 따라 거의 1:1로 변환이 가능하다.

Windows Linux
CreateProcess() fork()
exec()
TerminateProcess() kill()
WaitForSingleObject() waitpid()
pthread_join()
pthread_detach()
SetThreadpriority()
GetThreadPriority()
setpriority()
getpriority()
GetCurrentProcessID() getpid()
Exitprocess() exit()
CreateThread() pthread_create()
ThreadExit() pthread_exit()




Events
Evnet는 Windows에서 특정 사건이 발생했음을 알려주기 위해서 사용한다. Linux에서는 이를 위한 특별한 장치가 존재하지 않으므로 semaphore를 이용해서 이를 구현해 준다. 다만 초기화시에 초기값을 0으로 주기만 하면 된다.
Windows Linux
CreateEvent()
OpenEvent()
sem_init()
SetEvent() sem_post()
WaitForSingleObject() sem_wait()
sem_trywait()
CloseHandle() sem_destroy()

Semaphore
Semaphore는 Windows와 Linux의 용례가 비슷하다. Linux에서는 Windows의 event구현과 비슷하게 하면 되지만, 초기값을 얼마로 가지느냐만 다르게 설정을 해 주면 된다.
Windows Linux
CreateSemaphore() sem_init()
ReleaseSemaphore() sem_post()
WaitForSingleObject() sem_wait()
sem_trywait()
CloseHandle() sem_destroy()

Critical Section
Critical Section은 Windows에서 여러 쓰레드가 접근하지 못하는 임계 영역을 지정하기 위해서 사용된다. Critical Section은 Windows에서는 User객체로만 사용되며, 리눅스에서는 mutex로 구현을 해 주면 된다.
Windows Linux
InitializeCriticalSection() pthread_mutex_init()
DeleteCriticalSection() pthread_mutex_destroy()
EnterCriticalSection() pthread_mutex_lock()
LeaveCriticalSection() pthread_mutex_unlock()



Mutex
Mutex가 Windows의 Critical Section과의 차이점은 User영역 개체인지 Kernel 개체인지의 차이이다. Critical Section은 User모드 개체이기 때문에 하나의 프로세스 안에서 쓰레드 간의 임계영역 설정에 사용이 되지만, Mutex는 커널 모드 개채이므로 여러 프로세스간에 임계 영역 설정에 사용할 수 있다. Linux에서는 프로세스와 쓰레드간의 차이가 없으므로 mutex로만 구현되어 있다.
Windows Linux
CreateMutex() pthread_mutex_init()
CloseHandle() pthread_mutex_destroy()
WaitForSingleObject() pthread_mutex_lock()
ReleaseMutex() pthread_mutex_unlock()


Wrap up
Windows에서 Linux로 포팅할때 가장 신경써야 할 부분은 WaitForSingleObject와 WaitForMultipleObjects이다. 이 함수를 Linux로 가지고 갈때는 인자가 되는 핸들이 어느것이냐에 따라서 어떤 함수로 바꿔야 하는지가 결정이 되기 때문이다. 특히나 WaitForMultipleObjects에서 여러개의 핸들을 기다리면서 특정 이벤트가 일어나면 처리를 하는 경우에, 프로세스, 쓰레드, 뮤텍스, 소켓 등을 동시에 기다리면 이것들을 각기 다른 함수들로 분리를 해 줘야 하는데 이것은 정말 골치 아픈 일이다. 만약에 포팅을 염두에 두고 있다는 이러한 점에 각별히 신경을 쓰고 프로그래밍을 하도록 하자.

 

링크 : http://blog.paran.com/knowhow/17459919

반응형