2011년 5월 31일 화요일

[C++/CLI] AssemblyInfo


C++/CLI로 만든 어셈블리를 배포하다 보니 버전 관리가 필요했다. 버전은 어떻게 기록해야 할까?


■ AssemblyInfo.cpp ?!

Visual Studio 에서 C++/CLI 프로젝트의  솔루션 탐색기를 보면 AssemblyInfo.cpp 파일이 있다.




AssemblyInfo.cpp 파일을 열어 보면 어셈블리 버전을 기록할 수 있는 여러 Attribute 값이 보인다.




"의외로 간단히 해결 되는구나!" 생각하고 각각의 Attribute 값을 입력하고 빌드하였다.
하지만 생성된 어셈블리의 파일 버전을 보니 여전히 공백으로 표시된다.

자료를 찾아보니 C++/CLI 컴파일러는 C# 등의 컴파일러와는 다르게 자동으로 파일 버전을 기록해 주지 않는다고 한다. 윈도우즈 탐색기에서 어셈블리에 대한 파일 버전을 보고 싶으면 직접 입력해야 한다고 한다.
그렇다면 왜 AssemblyInfo.cpp 파일이 프로젝트 생성시 자동으로 만들어줄까?? 무언가 있을 것 같긴 한데..

참고) How to use AssemblyInfo.cpp - Visual C++ Developer Center


■ Using Version Resource

위에서 참조한 글을 읽어 보면 직접 버전 리소스를 추가하고 기록하면 된다고 한다.

Visual Studio 에서 리소스 뷰를 통해 작업을 해야한다.

*)
모든 환경에서 테스트 해본게 아니라 정확하지 않을 수 있는데 Visual Studio 개발 환경 언어가 C# 이라면
아마 리소스 뷰로 작업할 수 없을것이다.



Visual Studio 의 개발 환경을 초기화 한 후 C++ 로 변경해 주었다.


리소스뷰에서 app.rc 을 선택한 후 마우스 오른쪽 버튼을 눌러 "리소스 추가" 선택해 주자.




"Version"을 추가하면 어셈블리의 버전 정보를 기록할 수 있는 페이지가 보인다. 이 곳에 정보를 입력하면 어셈블리의 버전 정보가 기록된다.



2011년 5월 26일 목요일

여러 스레드가 데이터 멤버 참조 volatile


 여러 스레드가 하나의 데이터 멤버를 참조하고 싶을 때 volatile 멤버 필드를 사용했다.
즉, 여러 작업을 스레드풀로써 동작시켜 놨는데, 중간에 사용자가 그 모든 동작들을 취소하고 싶은 경우이다.
취소를 명령했을 때, volatile 필드값을 수정하고 스레드풀에서 작업하던 모든 스레드들은 이 volatile 필드값을 확인하고 종료 시켰다.

volatile 키워드는 동시에 실행중인 여러 스레드에 의해 변경될 수 있음을 나타낸다.

volatile(C# 참조) - MSDN

방법: 스레드 만들기 및 종료 (C# 프로그래밍 가이드) - MSDN




2011년 5월 12일 목요일

WaitHandle을 이용한 ThreadPool 스레드 종료 대기에 대하여.


 ThreadPool FCL을 이용하여 멀티스레딩 작업을 할 때, 스레드풀에 맞긴 모든 스레드가 종료될때까지 어떻게 기다려야 하는지 고민해 보았다.

 우선 CodeProject를 뒤져 ThreadPool 의 멤버 메소드인  GetMaxThreads, GetAvailableThreads 를 이용하는 방법을 찾았다.
cf) Waiting for All Threads in theThread Pool to Finish
하지만 위 방법은 규모가 있는 프로젝트에는 적용할 수 없다. ThreadPool은 정적 클래스이기 때문에 어셈블리 여러곳에서 사용되어질 수 있기 때문이다.

 그래서 다시 찾아본 방법은 ManualResetEvent 클래스와 WaitHandle 클래스를 이용하는 방법이다. WaitHandle의 정적 메소드인 WaitAll, WaitAny를 사용하였는데, 사용하다 발견한 점은 WaitAll, WaitAny의 매개변수로 넘겨주는 ManualResetEvent 인스턴스의 개수가 64개를 넘으면 NotSupportedException 예외가 발생한다.

 하는 수 없이, ThreadPool에 스레드를 넘길때 63개 이하씩 넘기는 방법으로 사용하였다.

다른 방법이 있나요??