강좌,팁

본 글은 "http://www.tipssoft.com/"의 게시글을 가져왔습니다.

 

멀티쓰레드 작업 할 때, 유용하게 사용 될 수 있는 정보인것 같아 데리고 왔습니다!

 

=====================================================================================

글 제목 : [팁앤정보] 스레드(Thread)는 몇개나 만들수 있다고 생각하십니까?

글쓴이 : 대천명

 

안녕하세요.
 
사고뭉치 프로그래머의 경험담을 소개하고자 간단한 글을 작성해봤습니다. 다소
주관적인 내용이니, 편하게 읽어주시면 감사하겠습니다. ^^;;
 
프로젝트를 하다 Thread를 많이 만들어야 하는 경우가 발생했습니다. 별 생각없이
스레드를 1000개정도까지 만들어보고 "아~ 잘되는구나!" 하고 테스트를 마무리하고
현장에 투입했습니다.
 
몇일이지나, 프로그램이 오류가 난다는 보고가 오기 시작했습니다. 처음에는
대수롭지않게 생각했지만 테스트 결과 스레드가 시스템의 상태에 따라 다소
차이는 있지만 1700 ~ 1850개정도 생성되면 더이상 생성하지 못하는 것이였습니다.
 
MSDN을 살펴보니, 스레드를 생성하면 기본적으로 1 Mbytes 가량의 스택이 스레드를
위해서 할당된다는 이야기가 있었습니다. ㅡ.ㅡ;;  계산을 해보니, 1700개의
스레드가 생성되면 약 1700 MBytes 즉, 약 1.7 GBytes가 스레드를 위해서 할당된다는
뜻이였습니다. 프로세스에 할당되는 기본 메모리 최대한도가 2 GBytes 이니, 더이상 스레드를
생성할수 없는 이유가 메모리 부족이라는것이였습니다.
 
실제로 스레드가 하는 일이 단순하여 1 Mbytes의 메모리를 사용할 필요가 없을듯하여
도움말을 자세히 읽어보니 스레드에 할당되는 스택의 할당 크기를 수정하고 싶다면
(.DEF) file 에서 STACKSIZE를 수정하면 된다는 것이였습니다. 하지만, MFC를 사용하는
Visual C++ 프로젝트에는 DLL 형식이 아닌이상 .DEF파일이 없습니다. 당황해서 헤매다가
Project Settings 화면에서 해당 항목을 찾았습니다. +_+;;
 
아래의 그림에서 빨간색 사각형에 크기를 명시하면 그 크기로 기본 스택의 크기가
수정되는것이였습니다. 기본적으로는 저곳에 아무런 값도 명시되어 있지 않습니다.
 
 
setting.gif
 

1 Mbytes = 1024 Kbytes = 1024*1024 bytes  = 1048576 bytes입니다.  이 값을 16진법으로
바꾸어보면 0x100000 입니다. 따라서 기본 스택의 크기가  1Mbytes이기 때문에 위 그림의
빨간색 사각형에 0x100000 값이 적혀있는것과 마찬가지 입니다.
 
결과적으로 스레드의 수를 두배로 늘리고 싶다면 기본적으로 할당되는 스레드의 스택크기를
절반으로 줄이면 됩니다. 즉, 0x80000 이라고 명시하면 됩니다. ( 0x50000 이라고 생각하시는
분은 16진수라는것을 기억하시기 바랍니다. ㅡ.ㅡ;; ) 마찬가지로 4배더 많이 생성하고
싶다면 0x40000 이라고 명시하시면 됩니다.
 
혹시, 더 좋은 방법이 있거나 다른 의견이 있다면 리플로 의견남겨주세요. ^^;;
 
P.S  자신이 아는것을 남에게 말한다는 것은 용기가 필요합니다. 비난도 감수해야하고 웃음거리가
       될수도 있습니다. 하지만, 자신의 이야기가 다른 사람에게 희망이 될수 있다는 기대를
       가지고 글을 남겨봅니다. 작은 정보라도 서로 공유했으면 좋겠습니다!!

 

===================================================================================

 

 


허창원

2018.04.04 10:31:10
*.138.9.79

좋은 정보네요.

또 팁스소프트 사이트를 알려주셔서 감사합니다. 좋은 자료들이 많네요.

감사합니다.

 

List of Articles
번호 제목 글쓴이 날짜 조회 수
» 멀티쓰레드 사용 시, 메모리 관련 참고사항입니다. [1] 요돌이 2017-10-24 502
114 [팁]타이머 사용시 주의할점. file 이현화 2014-02-13 2046
113 Lable 세로쓰기 [1] 초보 2013-12-21 1248
112 [강좌:45] ini 파일 이용하기(CISManip.dll 활용) [2] 허창원 2013-05-29 3396
111 [강좌:44] ini 파일 이용하기(기본 활용) [1] 허창원 2013-05-29 4550
110 [강좌:43] Panel 크기 변경시에 컨트롤의 위치나 크기 조절하기(CISManip.dll 활용) 허창원 2013-03-12 5850
109 [강좌:42] Panel 크기 변경시에 컨트롤의 위치나 크기 조절하기(기본 활용) 허창원 2013-03-12 6031
108 [팁21] 그래프를 지우고 그릴때의 plotHandle을 구하는 방법 [1] 야리싸내 2012-05-25 7101
107 [강좌:41] Prototype 프로그램 CISDEFPROG 소개 [1] [1] 허창원 2012-01-03 8268
106 [강좌:40] CIS Project를 시작하며... [4] 허창원 2011-12-29 8038
105 ------------- 이제 새로운 지평이 열립니다 ------------- 허창원 2011-12-29 8461
104 [팁]그룹명령(고수님들은 패스~ ^^;) file [2] 이현화 2009-06-15 22623
103 [KD스타일규칙] Panel, Control, Function 에 대한 이름부여규칙 file 허창원 2008-10-15 20442
102 [팁]Elaped Time [1] 이현화 2008-10-15 25902
101 [팁:19] 시리얼 포트 모니터링(Serial Port Monitoring) 유틸리티 소개 [9] [1] 허창원 2008-05-12 73137
100 [팁:18] CVI에서 ActiveX 컨트롤 사용하는 절차 file [2] 허창원 2008-04-07 30404
99 [강좌:39] 입맛대로 좀더 편리하게 배포용 설치 프로그램 만들기(CVI 8.5 이용) [1] [1] 허창원 2008-03-14 22397
98 [강좌:38] 배포용 설치 프로그램 만들기(CVI 8.5 이용) 허창원 2008-03-14 22082
97 [팁]간단한 최소화 기능개선입니다. 김민수 2007-10-05 23634
96 [강좌:37] 테이블 셀로 파일을 드래그앤드롭하기 file [1] 허창원 2007-09-01 29234