Win32 멀티스레드 프로그래밍에서 아쉬운 것
Windows Server 2003까지 아쉬운 거라고 해야 맞겠지만 아직 2008이 내 손에 넘어온 것은 아니므로 일단 토픽은 저렇게; Win32 API가 pthread 라이브러리에 비해서 가장 부족하다고 – 그리고 아쉽게 생각하는게 – 느껴지는게, conditional variable의 존재다. Event 라는 객체를 제공해주긴 하는데 2% 부족하다. 일단 Event는 두 가지 형태로 생성이 될 수 있다 – manual reset event (signaled -> non-signaled 전환이 수동) 와 auto reset event 2가지. 그리고 signaled state로 변환시키는 함수가 2가지 존재한다.
Lock, lock, lock … #2
Rica가 내 이전 글에 링크로 올려 준 beautiful code의 일부분에 해당하는 글을 지금 막 (제대로) 읽었음. 기억해 둬야할 점 + 읽다가 떠오른 것들을 정리해본다. 기억해야 할 것들 – lock이 좋지 않은 이유 (필요한 것 보다) 적은 수의 lock을 얻는 것은 문제가 된다 (필요한 것 보다) 많은 수의 lock을 얻는 것은 문제가 된다 – 심하면 데드락, 안 심해도 성능에 피해를 준다. 엉뚱한 lock을 잡고 있을 수 있다 – lock과 데이터 사이엔 명확히 정의되는 상관관계가 있는 것이 아니다.
Windows 키 맵핑 바꾸기
회사/집에서 Realforce 101 key를 쓴다. 이 키보드는 101키라서 때문에 흔히 쓰는(?) 한/영 전환 키와 윈도우즈 키가 존재하지 않는다. 한영키는 원래 잘 안 쓰고(shift+space 애용) 있어서 크게 문제가 안되었지만, 윈도우즈 키는 Win + R, Win + E를 꽤 쓰기 때문에 좀 불편해졌다. 그래서 찾은 방법이 registry에 등록된 키보드 Scancode map을 수정하는 것. HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layout 에 새로운 문자열 값 Scancode Map (binary data)를 추가하고, 00 00 00 00 00 00 00 00 02 00 00 00 5B E0 3A 00 00 00 00 00 를 데이터로 써준다.
Lock, lock, lock …
멀티 스레드 프로그램을 작성하는 경우 – 웹 서버처럼 스레드 상호간의 연관성이 적은 경우를 빼면 – 스레드 간에 공유 자원에 접근하는 부분은 언제나 문제가 된다. 제대로 작성하는 방법은 크게 2가지다. Lock을 써서 해당 영역을 하나의 스레드만 접근하게 한다 – 적절한 난이도 Lock-free 한 구성을 만들어 낸다 – 잘 정의된 몇 가지 경우를 제외하고는 적용하기가 매우 힘들다. 우선 그나마 적절한 난이도를 갖는 lock을 사용한 프로그래밍에 관해서 이번 포스팅에서 몇 가지를 설명하려고 한다. Lock은 일종의 문처럼 동작하는데, 특정 스레드가 해당 문에 들어가면서 + 동시에 문을 잠글 수 있는 기능을 한다 (사실 이게 비유로는 조금 부적절한게, 문을 통하지 않고도 들어갈 수 있기 때문에 --; 모두가 규칙을 지켜줘야한다.
C++: const keyword는 어떻게 쓸까?
C나 C# 그리고 Java 같은 언어와 C++이 가장 많이 다른 점 중에 하나는 const 라는 키워드를 지원한다는 점이다. (Java의 final이 살짝 비슷하긴 하지만 목적과 기능이 확실히 다르다) const 키워드가 지정할 수 있는 것은 2가지다. 대상(변수)이 변하지 않는 무언가라고 지정한다. 동작(함수, 연산자)이 동작의 주체를 변화시키지 않는다. 가장 간단한 예가 다음과 같은 거다. void foo(const int bar); 이런 함수의 내부(body)에서는 bar의 값을 바꿀 수 없다. 직접적으로 변수가 아니라 포인터에 const가 붙게 되면 상수성을 부여할 수 있는 곳이 2가지가 된다.
C++에 대한 이해란…
종종 블로그의 검색어 리퍼런스를 들여다본다. C++ 상속이라는 키워드로 검색해서 들어온게 있어서 확인해보는데, 같은 검색 페이지내의 글들을 보다 정말 “이건 아니잖아!“를 외치게하는 해석들을 보고. 그리고 검색된 내 포스팅은 C++의 class 들은 기본 상속 타입이 private이란 내용. 앞으로 몇 번 정도 이 비슷한 얘기를 해보려고 한다. 우선 알려주고 싶은 것은, 내가 보는 상속(inheritance)의 관점이란 것은 – 특히나 완전한 상속(public inheritance)은 – , interface의 공유를 통한 기능의 분류가 필요할 때 사용하는 무언가란 것이다. 가장 고전적인 예로 나오는 WYSIWYG 에디터에서 글자, 그림, 기타 등등이 “출력되는 부분"들을 필요로 할 때, 이 때를 위한 화면 출력, 크기 계산, … 등을 하나의 인터페이스로 생각하고, 이를 각각에 맞게 분류해서 – 글자는 찍고(?
새로 지른 마우스
MS Wireless Laser 6000 Natural 을 질렀습니다. 현재 사용 시작 1시간 후의 감상 일단 손에 잡히는 느낌은 집에서 쓰고있는 Logitech MX 510 (wired; optical) 보다 살짝 떨어지지만 손목은 편한것 같기도함 (그렇지만 키보드를 수십배 많이 쓰는 직업인데다가 물건 도착하고 처음 써본거라 플라시보 효과일 확률이 99.89%쯤; 좀 더 자세한(?) 결론은 퇴근하고) 배터리를 (AA건전지×2) 마우스에 끼워서 쓰는 방식(충전식이 아님) 살짝 무겁지 않을까 했는데 그건 아닌 것 같은 느낌이라 만족 중 버튼은 왼쪽 버튼/오른쪽 버튼/틸트 휠(4방향 휠)/휠 클릭/앞/뒤 이렇게 있는데, 기본으로 설정된 버튼 맵핑이 조금 다르다.
Civilization IV: Beyond the sword
…질렀다(…) 새하얗게 불태웠어. 아마존에서 알아봤었던 문명 4/문명 4 확장팩이, 확장팩 부분이 북미/APO/FPO 주소만 된다고 나와서 깔끔하게 포기하고 구매대행을 알아봤음. 아마존 기준 $29.99가 구매대행을 거치면 58,000원이라니 운송료가 들어가있다지만 폭리다. (사실 지금 사고싶은 원서가 2권 있어서 그거사는김에 같이 지를까 했는데 GG) 그래서 모 구매대행 사이트(가격이 비싸서 소개해주고 싶진 않다)에서 Civilization IV + Civ. IV exp. “Beyond the sword"를 구입(합계 10.3만) 오는데 한참 걸릴테니(확장팩은 북미에서 한국오고 다시 택배로 배송되야할 듯함) 이것도 괴로운 일인듯;
log4cxx
Apache Software Foundation(ASF)의 log4cxx는 유명한 java 기반 logging library인 log4j 의 C++ 버젼이다. 사실 log4j도 ASF 산하의 프로젝트고, log4net, log4php 등등의 자매 프로젝트들이 널려 있는, MT지원이 잘 되는 로깅 라이브러리들이다. 이걸 써보려고 몇 가지 테스트(?)겸 해서 돌아가던 소스에 붙여 봤다. 일단 장점 몇 가지, 설정이 간편하다 – 쌩노가다로 코드에 구조를 쳐 넣을 수도 있지만, log4j 및 기타 자매 프로젝트들과 동일한 형식을 갖는 설정 파일 혹은 xml 로 표현된 설정파일을 읽어서 로거의 출력 구조를 결정할 수도 있다.
오전에 IRC 쓰지 않기
오늘 Trac – timeline 을 보다가 느낀 점: 오전 시간에 작업한 량이 적다 – 오전 10시 이후(출근은 9시) ~ 오후 1시 사이의 commit이 그 이후 시간대 commit보다 적다 (10시 이전 commit은 아마 전 날 작업 마무리한 것 혹은 svn move를 위한 사전 작업이라고 판단됨) 결심: 오전에도 충분한 효율?이 나올 때 까지 오전(혹은 점심 먹고 오기 전)에 IRC 접속하진 말아야지(적어도 앞으로 7월 남은 기간 동안에는) 아무래도 출근 시간 지하철에 스트레스 받은 것 + 오전이라 좀 졸린 것으로 인해서 생각안하고 잡담을 하게 되는 느낌이니 좀 줄이고 프로그래밍을 하거나 책을 읽거나 코드 리뷰를 하려고 함.