Egloos | Log-in


win32 포팅, 그리고 Pthread for win32를 사용시 주의사항

이전에 솔라리스 스레드 기반으로 작성된 프로그램 4개(한 셋트다-_-)을 pthread로 건성건성(?) 포팅하고,
이제 그 프로그램을 win32에서 작동시켜야 하는 입장이 되어 이래저래 간단하게 포팅했었다. 뭐 순수 C 코드라 몇몇 VS 2005에서 가려대는 Deprecated된 POSIX 함수를 제외하면 포팅에 큰 무리는 없었다. 포팅을 요청한 클라이언트에게는 대략 2주라고 이야기 했었는데, 이틀 정도 잡으니까 3개 정도를 포팅할 수 있었다.

일단 몇몇 파일 다루는 쪽을 포팅하면 완전히 다 끝날 것 같다.

gettimeofday()와 같이 시간을 다루는 함수, 그리고 readdir() 과 같은 디렉토리 관리 함수, 그 밖의 getopt() 같은 것은 직접 구현하거나, 구글링을 해서 잘 만들어진 win32용 구현체를 구하던지 해서 포팅을 진행해야 한다. winsock의 경우, WSAStartup()을 사용하여 초기화 해주는 것만 잊지 않고, 소켓을 닫을 때 close() 대신 closesocket()을 사용해야 한다는 것, 그리고 read() / write() 대신 recv() / send()로 갈아타주면 된다는 사항을 빼면 큰 문제는 없을 것이다. 뭐 적절히 #if(n)def 절을 잘 사용해서, VC++임을 확인할 수 있는 _MSC_VER 와, WIN32 define으로 가려주면 ... 지저분한 코드가 되겠지만 각각의 플랫폼을 존중해 줄 수는 있을 것이다.

open()을 사용할 때 (VS2005에서 권장하는 네이밍은 앞에 _(underbar)가 더 붙는다) 주의 사항은, *NIX에서 바이너리 데이터를 다룰 때 굳이 IO_BINARY 플래그를 세팅해 줄 필요가 없었던 것과 달리, win32에서는 반드시 세팅해 줘야 한다. 그리고, S_IREAD|S_IWRITE 역시 세팅해줘야 close() 이후에 해당 파일의 attribute에 read-only가 걸리는 현상을 막을 수 있다.

여튼, 이전에 솔라리스 - pthread로 포팅 하던 가운데 실수를 좀 저질렀으나,
운빨(?)로  잘 돌아가던 녀석이 pthread for win32에서 민감하게 반응해 준 터라, 실수를 잡아낼 수 있었다.

주의사항은,

1. pthread_mutex_t 를 사용할 때는 반드시 pthread_mutex_init()를 해주던가, static으로 설정하는 녀석을

static pthread_mutex_t pt_mutex_ids = PTHREAD_MUTEX_INITIALIZER;

로 초기화 해줘야 한다. 신기하게도, init를 하지 않을 경우 pthread_mutex_unlock()에서 빵- 하고 터지더라.


2. 각 thread의 stack size를 반드시 설정해 줄 것.

뭐 사용하는 스레드의 수에 맞게 조정해야 할 일이지만, 리눅스나 기타 POSIX 호환 시스템의 경우 스레드당 기본 스택 사이즈가 주어지기 때문에 보통은 별로 신경 안써도 문제가 없는 항목이다.
그런데 pthread for win32의 경우 pthread_attr_setstacksize()를 사용하여 초기화 하지 않으면 기본 stack size가 0이 되어버려, Visual Studio (포팅에 사용한 컴파일러는 VC++ 2005.)에서 0xC00000FD stack overflow를 일으키고 프로그램이 죽는 현상이 발생하게 된다. pthread for win32를 사용할 때, stack overflow가 발생하면 일단 thread stack size를 확인해보는 것이 좋겠다.


둘 다 pthread를 다룰 때 기초적인 사항이지만, 생각 없이 코드를 다루다보니개념부족으로 이런 삽질을. 으하하.

by 달가락 | 2009/02/08 12:59 | 재미없는것들 | 트랙백 | 덧글(2)

트랙백 주소 : http://dalgarak.egloos.com/tb/2166011
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by onion at 2009/02/21 02:35
알바인건가요? 역시 머쪄염...@.@;
Commented by 달가락 at 2009/02/22 15:26
아뇨.. 연구실 물건이에요. 알바였으면 안했을 듯..

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶