C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[44566] TCriticlaSection TThreadList 의 데드락 현상.
ayh [] 1444 읽음    2006-04-19 19:48
indy로 보드 게임 서버를 구축중입니다.

멀티쓰레드를 이용하는 작업은 해본적이 없는 터라서, (늘 서브 쓰레드 하나 만들어 쓰는 정도였죠.)
여러 쓰레드가 공유자원 특히 TList 객체에 접근하면서 문제가 생기더군요.
TList에 넣어놓은 객체를 Delete후 Free하기만 하면 다른 부분에서 Access Violiation이 일어나는 걸 보고, 왜일까 생각해보니 다른 쓰레드가 해당 TList를 읽고 있을 때 발생할 수 있는 문제일 듯 하더군요.

해서 뒤져보니 나오는게, TCriticalSection을 사용하는 방법이었습니다.
의심되는 부분에 Enter, Leave를 써서 구축했습니다만, 어느 순간 얼어 붙더군요.
한 줄 한 줄 쫓아가보니, 두 객체에서 동시에 Enter 하는 순간 얼어 붙는 것 같더군요.

일단, 시간이 없어서 CriticlaSection의 사용은 유보하기로 하고 찾아보니, TThreadList가 있더군요.
이걸 쓰면 되겠다 싶어서 TList를 TThreadList로 모조리 바꾸고, LockList, UnlockList를 써서 구축했습니다만, 또 얼어붙더군요. 여기저기 뒤져보니깐, TTheradList의 LockList에서 TCriticlaSection을 사용한다는 코멘트가 나오더군요.

안되겠다 싶어서 이래저래 정리해서, TList의 객체를 삭제해야 될 때는 일단 해당 객체의 프로퍼티를 변경해 놓은 뒤 일정 기간에 한 번 씩 모아서 날려버리는 방식으로 프로그램을 돌아가게는 해 놨습니다만....

궁금한 건 TCriticalSection이 왜 얼어붙었을까 하는 점입니다.
원래 올바른 사용법이 있지 않을까 생각됩니다만....

그리고 CrticalSection 외에 멀티쓰레드에서 공유자원에 대한 접근을 제어하는 방법에 대해서 쓸만한 게 있으면 답변 주시면 감사드리겠니다.
좋은 하루 보내시구요~

+ -

관련 글 리스트
44566 TCriticlaSection TThreadList 의 데드락 현상. ayh 1444 2006/04/19
44567     [자답] TCriticlaSection TThreadList 의 데드락 현상. ayh 2011 2006/04/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.