본문 바로가기

프로그래밍/API

(32)
C/C++의 anonymouse structures... 다소 생소하게 느끼는 개발자도 있으리라 본다. 일반적인 방식으로 구조체(struct)를 정의하는 개발자라면 더 그럴것이다. IOCP개발중 가장 많이 사용하는 구조체 중의 하나가 OVERLAPPED라는 구조체이다. - 이 구조체를 보면 이상하게 보이는 정의가 있다. typedef struct _OVERLAPPED { ULONG_PTR Internal; ULONG_PTR InternalHigh; union { struct { DWORD Offset; DWORD OffsetHigh; }; PVOID Pointer; }; HANDLE hEvent; } OVERLAPPED, *LPOVERLAPPED; 참으로 난감하지 않는가? 어떤 개발자는 알것이고 어떤 개발자는 컴파일이 되느냐 의심가는 개발자도 있을줄로 안다. ..
IOCP의 ConnectEx 모델... IOCP의 AcceptEx() 다음으로, ConnectEx() 모델이 있다. 이 모델 또한, AcceptEx() 와 마찬가지로 비동기로 처리할수 있는 함수로 connect()시 non-block상태로 처리할수 있는 장점이 있다. WSAConnect()대신 굳이 ConnectEx()모델이 필요한 이유는 서버의 프로세싱 과정의 block을 제거해 서버의 처리를 지속하기 위해서 이다. -- 별도의 쓰레드를 사용해 connect() 를 할수 있지만 이 방식 보다는 좀더 유용할듯 하다. 그럼, 설명을 해보겠다. 1. ConnectEx 함수 포인터를 얻을 필요가 있다. AcceptEx()는 별도의 함수 포인터를 얻지 않아도 바로 접근 처리할수 있지만, ConnectEx()는 얻어서 처리하였다. 함수의 정의에 문제가..
IOCP의 AcceptEx 모델~ IOCP에는 기본적인 accept() 또는 connect()의 확장 모델이 있다. 이 모델은 비동기 형태의 처리를 하게 하여, IOCP의 사용시 일관된 처리를 유지할수 있게 만들어 준다. -- 굳이 확장함수가 아니라도 WSAAccept()와 같은 함수만 사용해서도 구현이 가능하다. 여기에서는 IOCP에 어떻게 AcceptEx() 함수를 적용시키는지 정리해보고자 한다. 1. AcceptEx()함수를 사용하기 위해 #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"mswsock.lib") // AcceptEx() 가 추가되어야 한다. 이 명령은 자동적으로 라이브러리를 링크하도록 하는 명령으로, AcceptEx() 함수는 winsock 라이브러리가 아닌 ms w..
Windows에서 rwlock의 구현.. 가끔씩 동기화 처리를 위해 rwlock(read/write)이 필요할때가 있다. 나도 이러한 구현 소스를 찾아 보기 위해 인터넷을 돌아 다니다 GDK관련 사이트에서 구현 소스를 얻은 것으로 기억한다. rwlock의 최대 장점은 read는 중복해서 lock이 설정될수 있지만, write락은 CRITICAL_SECTION 처럼 단 하나의 lock만 처리해 효율을 높이는데 사용될수 있다. 그럼 구현에 필요한 기본 자료형 부터 확인해보면.. typedef struct { HANDLE write_mutex; HANDLE read_event; LONG readers; } rwlock_t; 이 필요하고, 구조를 초기화 하기 위해서는 rwlock->readers = 0; rwlock->read_event = Creat..
Database ConnectPool의 구현... Koders를 검색하던중 ConnectPool의 구현을 C++의 template기반으로 구현한 소스가 있어 정리해 봤습니다. 유용하게 사용할수 있을것 같습니다. 아래 첨부된 소스의 원형은 http://www.koders.com/cpp/fid7219F33FFBFD5B5AAEC68184D06F48C0DAAF347C.aspx 에 존재합니다. #ifdef _MSC_VER #pragma warning( disable : 4503 4355 4786 4290 ) #endif #include #include class ConnectionID { public: ConnectionID( const std::string& database, const std::string& user, const std::string& pas..
MSDN에 있는 쓰레드 풀~ 참 알면 알수록.. 감탄이 나오는 MSDN... 쓰레드풀을 구현하는데 이보다 더 좋은 함수는 없을듯 하다~ Syntax BOOL WINAPI QueueUserWorkItem( __in LPTHREAD_START_ROUTINE Function, __in_opt PVOID Context, __in ULONG Flags ); Parameters Function A pointer to the application-defined callback function of type LPTHREAD_START_ROUTINE to be executed by the thread in the thread pool. This value represents the starting address of the thread. This ..
우선순위큐(Priority Queue) 알고리즘.... 프로그램을 하다 보면, 실시간 소팅일 필요한 경우가 있다. 이때 문제점이 데이터의 값 하나가 바뀔때 마다 qsort()을 하더라도 엄청난 자원을 필요로 한다는 것이다. 이러한 문제점을 해결하기 위한 방법이 소개할 우선순위큐(Priority Queue)라는 알고리즘 이다. 이 알고리즘은 일반적인 소팅알고리즘과 틀리게 전체를 소팅하지 않는다는 특징을 가지고 있어 실시간 소팅을 할때 상당히 유용하다. (문제는 전체를 소팅하지 않기 때문에 최상의 값 만이 의미를 갖는다는 것이다.) 이 알고리즘이 STL에도 존재한다. 그러나 STL과 같은 알고리즘은 데이터를 push()하고 pop()하는 것에 맞춰져 있다. 즉, 저장된 데이터의 값이 변경되거나 데이터를 삭제하고자 할 경우 전체를 다 꺼냈다가 다시 집어넣어야 하는..
GCC에서 자동실행 함수 만드는 방법... 예전 Borland C++로 프로그램을 할때 많이 사용하던 명령이 있었다.. 바로, #pragma startup function-name #pragma exit function-name 대충 어떤 역활을 하는 pragma 인지 알것이다~ 리눅스(GCC) 기반으로 프로그램을 할때 이러한 기능이 필요 할때가 있다. 그런데, 나는 이러한 기능을 pragma에서 열심히 찾았었다. 그런데, 이러한 기능이 별도의 속성으로 설정해 사용할수 있다는 것을 알고 참으로 고마웠었다... 나처럼 이런 수고를 하려는 개발자에게 간단한 Tip을 소개한다. static void FUNC(void) __attribute__ ((constructor)); static void FUNC(void) __attribute__ ((destr..