성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<span> <div class='mainCenterTitle'>Vista & Longhorn: 13. InitOnceExecuteOnce API 소개</div><br /> <br /> 재미있는 API가 Windows 6.0 버전부터(비스타, 롱혼) 포함되어서 간단하게 소개를 해드릴까 합니다. 사실 ^^ 비스타 관련 API를 몰아서 소개해 드리면 좋겠지만, 저 역시도 이렇게 가끔씩 눈에 띄는 것이 나올 때마다 틈틈이 봐두는 식으로 공부하기 때문에 그럴 수는 없답니다. ^^ (개인적으로 이런 공부 방식을 좋아합니다. 하나씩 하나씩 알아가는.)<br /> <br /> 소개라고 ^^ 말씀드렸는데요. 그럴 수밖에 없는 것이 이미 코드 구루에 다음와 같은 토픽으로 자세하게 설명되어져 있기 때문입니다.<br /> <br /> <pre class='code'> Simplified One-Time Initialization in Windows Vista ; <a target='_tab' href='http://www.codeguru.com/columns/kate/article.php/c13091'>http://www.codeguru.com/columns/kate/article.php/c13091</a> </pre> <br /> 위의 토픽을 보시면, 덩달아서 새로운 함수인 "_WriteBarrier"에 대해서도 알게 됩니다. 일단, 제가 파악해 본 바에 의하면, 최적화가 컴파일 타임에도 발생하지만 64bit 환경에서는 프로세서에 의해서도 발생을 한다고 합니다. 컴파일 타임에 대한 최적화 방지 예제는 "_WriteBarrier" API 도움말 자체에 코드가 같이 설명되어져 있습니다.<br /> <br /> <pre class='code'> C++ Language Reference - _WriteBarrier ; <a target='_tab' href='https://docs.microsoft.com/en-us/cpp/intrinsics/writebarrier'>https://docs.microsoft.com/en-us/cpp/intrinsics/writebarrier</a> </pre> <br /> 프로세서에 의한 최적화 예제 코드는 "<a target='_tab' href='http://www.codeguru.com/columns/kate/article.php/c13091'>Simplified One-Time Initialization in Windows Vista</a>"에 나와 있는 것이 그에 해당합니다. 재미있으니 한번 코드를 살펴보십시오. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이번 이야기의 주제는 "Vista's One-Time Initialization Support"이니, 그에 대해 조금 더 살펴보겠습니다. 보통, 동기화 코드 중에는 다음과 같은 식으로 초기화를 해야 하는 코드가 빈번하게 발생하는데요.<br /> <br /> <pre class='code'> <b>if (g_p == NULL)</b> { EnterCriticalSection(&G_CriticalSection); <b>if (g_p == NULL)</b> { g_p = new ExpensiveToCreateClass(); } LeaveCriticalSection(&G_CriticalSection); } return g_p; </pre> <br /> 보시는 것처럼, 다소 쓸데없는 듯이 2번의 NULL 검사(double-check code)를 해야 합니다. 음... 그러고 보니 이러한 패턴을 어디선가 본 것 같은 기억이 납니다. 그렇군요. ^^ 다음의 토픽에서 재미있게 읽었었지요.<br /> <br /> <pre class='code'> Loner's .NET Blog - Quiz: Synchronization Bug ; <a target='_tab' href='http://www.simpleisbest.net/archive/2006/09/21/1103.aspx'>http://www.simpleisbest.net/archive/2006/09/21/1103.aspx</a> Loner's .NET Blog - Answer: Synchronization Tip ; <a target='_tab' href='http://www.simpleisbest.net/archive/2006/09/27/1125.aspx'>http://www.simpleisbest.net/archive/2006/09/27/1125.aspx</a> </pre> <br /> 자,,, 이러한 패턴을 비스타에서는 InitOnceBeginInitialize API를 사용하여 다음과 같이 수정할 수 있습니다.<br /> <br /> <pre class='code'> INIT_ONCE g_init; BOOL CALLBACK CreateETCCPointer(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContext) { *lpContext = new ExpensiveToCreateClass(); return TRUE; } PVOID lpContext; if (InitOnceExecuteOnce(&g_init, CreateETCCPointer, NULL, &lpContext)){ return (ExpensiveToCreateClass*)lpContext; } </pre> <br /> 왠지... ^^; 더 간결해 보이지는 않는군요. 또한 아직 Managed 래퍼 코드는 없는 듯 하니 C# 등에서 사용하기에는 좀 더 기다려야 될 것 같습니다.<br /> <br /> 마지막으로, InitOnceExecuteOnce API는 비동기 함수 버전을 제공해 주는 데, "InitOnce<b>Begin</b>Initialize" / "InitOnce<b>Complete</b>" 쌍의 함수가 그것입니다. Native API라서 InitOnceExecuteOnce 함수 자체도 그다지 쓸 일이 없을 것 같은데... ^^ 그에 대한 비동기 함수는 더더욱 잘 안 쓰겠지요!<br /> <br /> <hr style='width: 50%' /><br /> <br /> <pre class='code'> InitOnceExecuteOnce ; <a target='_tab' href='http://msdn2.microsoft.com/en-us/library/ms683493.aspx'>http://msdn2.microsoft.com/en-us/library/ms683493.aspx</a> define _WIN32_WINNT as 0x0600 or later Client Requires Windows Vista. Server Requires Windows Server "Longhorn". Header Declared in Winbase.h; include Windows.h. Library Use Kernel32.lib. </pre> <br /> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </span>
첨부파일
스팸 방지용 인증 번호
2267
(왼쪽의 숫자를 입력해야 합니다.)