반응형

전체 글 214

SetEvent(..) & 멀티쓰레드 버그

꽤나 재미있는 버그였다... int tst; //Thread#1 ... WaitForSingleObject(...); printf("%d", tst); ... //Thread#2 ... tst=3; SetEvent(...); tst=4; ... 이 상황에서 Thread#1이 Thread#2를 기다리다가 tst값을 찍을 경우, 찍히는 값은 3일까? 4일까? 이 코드는 전형적으로 시그널을 기다리는 코드로 Thread#1이 Thread#2의 시그널을 기다리고 있다. 그런데 중요한 것은 OS동작이다. 흔희 생각할수 있는, SetEvent(...) 호출한 후의 Context Switching은 바로 일어나지 않을 수도 있다. 이런경우 일정량 만큼 SetEvent(...) 이후의 코드가 실행되다가 Context S..

Win32 과연 어떤 Timer함수를 사용할 것인가?

이 글은 Code Project에 있는 Timers Tutorial을 정리한 것입니다. 우선, 윈도우는 윈도우 CE를 제외하면 리얼타임OS가 아닌 관계로 10ms와 같은 매우 작은 시간에 대한 정확한 처리를 요구하는 건 한계가 있답니다. (쥔장도 자세한 이유는 잘... 흠...) QueryPerformanceFrequency나 QueryPerformanceCounter와 같은 경우는 특정 시간 경과 후 이벤트를 처리하는 것이 주요 쓰임이 아니라 시간과 시간사이의 시간차를 계산하는 것이 주요 쓰임인 관계로 이 글에서는 언급되어 있지 않습니다. 반대로 말하면 시간과 시간사이의 차이를 정확히 측정하려면 QueryPerformanceFrequency를 사용하여야 겠죠? 1. Standard Win32 Timer..

First Chance Exception

SEH(Structured Exception Handler)가 처리하는 Structured Exception을 처리하는 과정에서 디버거가 제공해 주는 정보의 일종입니다. 제가 이해한 동작 메카니즘은 아래와 같습니다. 1. Exception 발생 2. 발생된 Exception 인식 3. First Chance Exception 메세지 발생 4. Exception Handling 5. if {Exception이 정상 처리?} 프로그램 계속 동작 else Second Chance Exception 메세지 발생 //Release모드로 컴파일되어서 작동시 프로그램 Crash를 의미함 내용을 읽다보면 이 API가 Win32API를 의미하는 것인지 유저가 만든 API를 의미하는 것인지 조금 모호하기는 합니다. 즉, ..

C++ 헤더파일에 선언할 수 있는 4가지 타입의 전역변수

최근에 헤더파일에서의 static 전역변수에 대한 포스트를 올렸다 지웠습니다. 생각지도 못한 버그를 만나 2시간이나 고생을 했기 때문이었는데, C/C++에서의 static 키워드는 여러모로 조심스러운 키워드인거 같습니다. 멀티쓰레드에서의 버그가능성까지... 이 글은 덕분에 테스트해 본 전역변수에 대하여 요약하여 놓은 것입니다. 참고로 테스트 환경은 Visual Studio 2008 sp1 입니다. object라는 클래스가 있다는 가정하에 헤더파일에 선언할 수 있는 4가지 타입의 전역변수는 아래와 같습니다. 1. object var; 2. static object var; 3. extern object var; //object var;라고 특정 cpp파일에 정의되어 있다고 가정합니다. 4. typedef ..

C++ 프로그래밍 2009.04.21

[STL] erase Story... beta

STL에서 가장 짜증나는 부분이 erase부분이 아닌가 싶다. erase와 remove의 차이점을 알아야 하고 거기에 몇 개 종류별 iterator의 erase 기법을 알아야 한다. 흠... 암기하기도 그렇고... 꽤나 귀찮은 것들 하나다. 그래서 찾아본 것을 정리하면 아래와 같습당... map's iterator erase 방법 // 1. 특정 조건에 따라 제거 map mp; for(map::iterator i=mp.begin(); i != mp.end(); ) { if( {조건문} ) { mp.erase( i++ ); } else { ++i; } } // 2. 전체 제거 map mp; for(map::iterator i=mp.begin(); i != mp.end(); ) { mp.erase( i++ ..

C++ 프로그래밍 2009.04.21

[링크] Tistory 100배 즐기기.. beta...

휴~ 걍... 그날 그날 생각한게 잊혀지는게 아쉬워 메모나 해놀까 했는데... 티스토리도 꽤나 복잡한 프로그램인듯 보입니다... 그 중에 흔히 쓰는 테크닉에 대해서 모아 봤습니다. C/C++ 소스 컬러링하기 뭐... 흔히들 쓰는 기법인데 찾아보니 조금은 인내하며 설정을 해야 하더군요... 아래 블로거들의 설명을 따라하시면 30분에 Okay 되시겠습니당~ ^0^range.Net님의 소스코드 하이라이팅, 컬러링 aJava님의 tistory에서 source code highlight 이용하기

링크 2009.04.20

Lua R6034 Runtime Error in Visual Studio 2008 in Vista

증상 XP에서 잘 실행되던 소스가 Vista로 옮겨서 컴파일 하고 실행을 하려고 하니 R6034에러가 났다. 원인 Visual Studio 2008에서는 CRT(C RunTime, 일반적으로 컴파일러들이 자동으로 링크하는 기본 C라이브러리를 말함당)를 9.0버전을 사용한다. 하지만 내가 만들고 있던 루아스크립트 엔진이 참조하는 lua5.1.dll은 Visual Studio 2005의 CRT인 8.0버전을 사용한다. 뭐, XP에서는 그냥 루아 5.1버전과 같이 딸려오는 msvcr80.dll을 사용하면 되지만 Vista에서는 잘못된 CRT를 로드했다는 에러를 낸다. 아마도 Vista에선가, .Net에선가 dll 관리 정책의 변화떄문인 듯 보인다. 소위 말하여 WinSxS라는 거... 실행파일 (참조)-> L..

[링크] 음악관련 방송 사이트

http://home.ebs.co.kr/space/ http://ebs-space.co.kr EBS Space 공감 내가 우리나라에서 가장 좋아하는 음악프로그램으로 진정 많은 실력있는 언더뮤지션의 EBS 콘서트를 볼 수 있다. 솔직히 근래의 한국 음악계는 어떻게 보면 댄스음악 장르가 아니라면 언더뮤지션쪽의 사운드가 더욱 풍부하고 뛰어난 듯 하다. 뭐랄까, 힙합클럽이 장악하기 전 홍대 클럽의 영향이라고나 할까... 좀 더 이야기 하자면 대중적인 KBS 러브레터, 중년들을 위한 70·80 콘서트와는 차이를 보이며 언더적 색채를 내는 최고의 라이브 프로그램인 듯... 배철수 음악캠프(http://www.imbc.com/broad/radio/fm4u/musiccamp/index.html) 최근에는 서태지 출연으..

링크 2009.04.14

C/C++ 관련 유용한 글 링크 및 소개

가변인자 포워딩 시키기(http://www.jiniya.net/tt/599) int realsum(int count, ...) { // 인자들의 합을 구하는 작업들 return sum; } int mysum(int count, ...) { return realsum(count, ...); } 위의 코드와 같이 ...으로 표현되는 가변인자를 받아서 다른 가변인자 함수를 호출하는 코드가 나와 있습니다. 어셈블리까지 들어간 코드라서 추천하고 싶지도 구지 내용을 다 이해할 필요는 없는 듯 보이지만 필요할 때 Copy&Paste하면 요긴하게 사용할 수 있을 듯 보입니다.

[링크] 하드웨어 성능 벤치마크 차트

여기 링크에서 소개하는 하드웨어 사이트는 하드웨어 성능을 벤치마크 하는 사이트 들입니다. 이 사이트들은 상세하게 하드웨어의 특성을 설명하기 보다는 벤치마크 혹은 많이쓰는 일반 프로그램을 사용하여 벤치마크한 수치데이터 차트를 제공하는 사이트 입니다. 하드웨어 성능의 수치적 상대성과 시장에서의 가격차를 계산하여 합리적으로 구매할 때 사용하시면 됩니다. 물론, 성능 외적인 부분, 특히 VGA의 화질적인 부분 혹은 HDD의 소음과 같은 부분은 별도로 생각해 주셔야겠죠? tom's hardware (http://www.tomshardware.com/charts/) 전 세계에서 하드웨어의 성능 벤치마크 차트를 가장 빠르고 정확하고 제공하는 사이트 입니다. VGA, CPU, Memory, HDD 등의 차트를 제공하며..

링크 2009.04.12

Boost

http://www.boost.org/ 워낙 유명한 라이브러리라 설명이 필요없을 듯... 몇 년전까지 메타프로그래밍에 관심있을 때 좀 찾아보았던 라이브러리 인데 지금은 새로운 C++ 표준에 까지 영향을 주는 최고의 C++ 라이브러리 중 하나가 되었다. 메타프로그래밍이란 것은 Template의 응용으로 많은 문제를 Run-Time 이전에 Compile-Time에서 해결하거나 Generic하게 구현하는데 초점이 맞추어져 있다. 참고로, Boost 주의자 들이 아무리 이 라이브러리 사용이 직접 구현하는 것보다 낫다고 말해도 떄로는 직접 구현하는 것이 나을 떄가 있다. 역사가 반복된다고 했던가? 10년 전에는 직접 구현보다는 MFC를 사용하자, 뭔 라이브러리를 사용하자 했는데 지나치게 프로그래머가 라이브러리에 ..

float, double network ordering, float, double 타입의 네트워크 순서(오더)에 관하여...

float 타입이나 double 타입의 전송은 네트워크 프로그래밍 관련하여 공부한 몇 권의 책에서 나오지 않는 내용이라 열시미 찾아 보았답니다. 우선 float 나 double 타입에 대해서 기본적인 지식을 알아보면 아래와 같이 인터넷에서 찾은 글이 참이나 설명을 잘해주고 있습니다. Floats and doubles tend (in modern chip architectures) to be represented using an IEEE-standard format; so the commonly defined types *are* "float" (single-precision) and "double" (double-precision). These have precise meanings in the stan..

Direct3D Mesh

Direct3D 함수 중 D3DXCreateSphere(..)와 같이 메쉬를 만드는 함수는 Mesh를 만들지만 Mesh에 텍스처 정보가 없어서 텍스처를 입힐 수 없습니다. 이럴경우 메쉬를 복사한 후에 복사된 메쉬가 가지고 있는 버텍스 정보를 수정하여 텍스처를 입히면 됩니다. 여기서 난점은 텍스처를 수작업으로 입혀주어야 한다는 점입니다. 즉, 수학적으로 계산하여 입혀주어야 합니다. 아래사이트에 D3DXCreateSphere로 만든 구에 텍스처를 입히는 방법이 예제로 나와 있습니다. 참고로 이 텍스처 맵핑은 구를 바탕으로 한것이라 다른 메쉬와 같은 경우, 특이나 정육면체와 같은 경우에는 아래에 나와있는 수학적 공식이 아닌 다른 계산으로 입혀야 합니다. http://www.mvps.org/directx/art..

C++ 흔한 실수

개인적으로 겪은 실수에 대한 로그입니다. 매크로 함수의 이름이 클래스 멤버함수와 같은 이름일 경우의 처리 케이스) numeric_limits::max();와 같이 STL을 이용하여 int의 max형을 얻으려고 했는데 warning C4003...와 같은 에러를 얻었다. 이런 현상이 일어난 이유는 max(..)라는 매크로 함수가 에 정의되어 있기 때문이었다. 즉, 매크로가 전처리단계에서 확장된 후에 컴파일이 되기 때문에 흔히 발생하는 문제이다. 해결책은 2가지가 있다. 1. #define NOMINMAX을 포함 전에 정의하는 방법이 있다. 2. (numeric_limits::max)()와 같이 함수코드를 ()로 감싸는 방법이 있다. 결국, 2번 방법을 선택했는데 이렇게 편한 방법이 있는지도 모르고 그동안은..

C++ 프로그래밍 2009.03.23
반응형