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
[72927] Re:Re:Re:Re:Re: Synchronize 함수 호출은 런타임 비용을 많이 치루게 됨
박지훈.임프 [cbuilder] 4639 읽음    2015-08-24 21:55
물론 그런 방법도 가능하지요.
하지만, 쓰레드 세이프 StringList가 Synchronize보다 시간 비용 면에서 항상 유리하다고 보기는 어렵죠.
StringList를 쓰레드 세이프하게 만들려면 크리티컬 섹션 처리가 보통이겠고, Add, Delete 등 StringList의 내용을 수정하는 모든 코드를 오버라이드해서 매번 EnterCriticalSection, LeaveCriticalSection 처리를 해줘야 할텐데요.

처음 질문하신 분의 글의 내용으로 짐작하기로는 아마도 로그 성격의 데이터를 StringList에 잔뜩 담아두다가 일정 시간 혹은 특정 조건마다 서버로 전송해서 저장하려는 목적으로 보이는데, 그러면 메인 쓰레드에서의 StringList의 Add 동작이 서브쓰레드의 서버 전송 동작보다 압도적으로 많이 발생할 것입니다. (만약 그렇지 않다면 모아뒀다가 한번에 전송하려고 하실 이유가 없겠지요)

EnterCriticalSection/LeaveCriticalSection이 쓰레드 동기화 방법중에서는 가볍고 빠른 방법이긴 하지만, 매번 로그 한줄을 남길 때마다 (StringList::Add) 크리티컬 섹션을 설정했다가 풀었다가 하는 것이, 과연 가끔 한번씩 Syncronize 설정해서 StringList 내용을 복사하는 속도보다 빠르다고 단정할 수 있을까요. 제가 생각하기로는 단위 시간당 쌓이는 로그 라인이 많으면 많을수록 오히려 Syncronize가 더 빨라질 것 같습니다.

물론 쓰레드 세이프 StringList를 만들지 않고 서버 전송하는 시점에 Syncronize 대신에 크리티컬 섹션 등을 쓰는 것이 더 낫기도 합니다. 하지만 그럼에도 제가 Syncronize를 우선적으로 추천한 이유는, 성능 차이는 미미하면서 Syncronize가 더 코드 작성 및 유지보수가 간편하기 때문입니다. 로그를 쌓는 동작은 초당 수백, 수천번도 발생할 수 있겠지만, 쌓인 로그를 서버에 네트워크로 전송하는 동작은 인터벌이 빨라봐야 십여초 이상으로 하는 것이 보통입니다.

짧게 잡아서 로그를 십초마다 한번씩 전송한다고 해도, 매 10초마다 한번 크리티컬 섹션 처리를 하는 방법과 Syncronize 처리를 하는 방법 사이의 시간 차이가 어떤 의미있는 차이가 될까요. 실제 운영상황에서는 완전히 무시할 정도의 미미한 차이밖에 되지 않을 겁니다. 물론 그 미미한 차이라도 없는 것과 있는 것은 기술적으로 차이가 있는 건 맞긴 하겠습니다만, 성능 차이에 너무 몰입하셔서 쓰레드 동기화를 초당 수백번 발생하는 경우와 수십초마다 한번 발생하는 경우의 큰 차이를 무시하신 것 같습니다.



동기화 님이 쓰신 글 :
: 생산자와 소비자 관계는 동기화에서 가장 기초적인 개념 입니다.
: StringList 를 쓰레드 세이프하게 하나 만들어서 사용하면 간단하고 퍼포먼스에서도 유리 합니다.
:
: Synchronize함수의 목적은 어떤 코드를 메인 쓰레드 Context 에서 실행되게 하는 게 목적이고 그에 따른 런타임 댓가도 큼.
: 일반적인 동기화를 위해 사용되는 함수가 결코 아님.
:
:
:
:
: 박지훈.임프 님이 쓰신 글 :
: : 통신 문제로 시간 지연이 생긴다면 말씀하신 그런, 그러니까 통신 과정에서 블로킹이 걸린 때문에 메인쓰레드가 지연되는 상황이 벌어질 수 있겠습니다.
: :
: : 그런 우려가 있다면 이렇게 처리하면 될 듯 싶네요.
: : 1. 서브쓰레드에서는 Synchronize로 StringList의 내용을 다른 객체로 복사만 합니다.
: : (굳이 StringList를 새로 만들어서 하기보다는, 내용만 복사해두면 되는 것이니 그냥 스트링이면 되겠네요)
: : 2. Synchronize를 빠져나온 서브쓰레드의 일반적인 루틴에서 이 복사본을 파일로 저장하고 통신으로 전송합니다.
: :
: : 쓰레드간 충돌이 생길 수 있는 것은 같은 StringList에 두 쓰레드가 동시에 접근할 경우 뿐이므로, Synchronize에서는 내용 복사를 해두고 복사본으로 파일 저장 및 전송을 하게 되면 충돌의 여지는 없어지지요. 더불어서, Synchronize의 특성상 최소한의 동작만 Synchronize로 빼내는 것이 권장되기 때문에 더욱 나은 방법이 되겠습니다.
: :
: :
: : 그린비 님이 쓰신 글 :
: : : Synchronize 함수가 메인 UI 접근에서만 사용하는 줄 알았는데, 이런 부분이 있었군요~!
: : : 무지무지 감사드립니다~~~~~~~~~
: : :
: : : 그런데 한가지 걱정되는게, Synchronize 함수사용 시,
: : : 혹시나 서브쓰레드에서 파일저장후 서버에 통신중에 , 
: : : 통신 문제로 멈추게 되면,(몇 초 에서 몇 십초동안 응답없음 상태가 될 경우)
: : : 메인쓰레드도 그 시간 동안 멈추게 되진 않나요? 서브쓰레드 동작이 메인쓰레드에 영향을 주면 안되서요.
: : :
: : :
: : :
: : : 박지훈.임프 님이 쓰신 글 :
: : : : 그런 목적으로 사용하는 것이 TThread의 Synchronize 함수입니다.
: : : : 특정 객체에 대한 접근이 두 쓰레드 사이에서 충돌할 것으로 예상되는 경우 서브쓰레드의 동작을 Synchronize 함수를 사용해 실행하면 됩니다. 그러면 해당 동작은 서브쓰레드에서 실행했음에도 메인쓰레드의 컨텍스트에서 동작하게 됩니다.
: : : :
: : : : 말씀하신 케이스에서는, 서브쓰레드에서 StringList를 파일로 저장하고 서버에 전송하는 동작을 별도의 함수로 뺀 후, 그 함수를 Synchronize 함수로 감싸서 호출하면 됩니다.
: : : :
: : : :
: : : :
: : : : 그린비 님이 쓰신 글 :
: : : : : 안녕하세요~ 더운 날씨에 노고가 많으십니다~~!
: : : : :
: : : : : 전역으로 선언한 StringList가 있고요.
: : : : : 여기에 로그를 Add 하고 파일 저장 후 서버에 전송하는 게 목적입니다.
: : : : :
: : : : :
: : : : : 1) 메인 프로세스에서는 StringList에 Add 만 합니다.
: : : : : 2) 추가 쓰레드에서는 StringList를 주기적으로 파일 저장을 하고, 서버에 전송을 합니다.
: : : : :
: : : : : <질문 1>
: : : : : 여기에서 문제가 예상되는게, 메인프로세스에서 StringList에 Add를 하는 도중에
: : : : : 만약 추가 쓰레드가 StringList에 접근해서 파일저장을 하려고 하면 동기화가 안지켜 질 것 같은데요..
: : : : : 정말 그런가요?
: : : : :
: : : : : <질문2>
: : : : : 해결 하려면 메인프로세스에서 파일을 저장하고, 추가 쓰레드에서 서버에 전송을 하게 하면
: : : : : 해결이 될까요?
: : : : :
: : : : :
: : : : : 관심 부탁드립니다~~~

+ -

관련 글 리스트
72917 두 쓰레드에서 같은 StringList 사용간 충돌이 있을까요?(Add 및 파일저장) 그린비 4013 2015/08/19
72937     Re:두 쓰레드에서 같은 StringList 사용간 충돌이 있을까요?(Add 및 파일저장) 라스코니 4378 2015/08/31
72936     Re: 쓰레드 동기화 기본 개념의 부재? 빌더(TWx) 5207 2015/08/30
72921     Re:두 쓰레드에서 같은 StringList 사용간 충돌이 있을까요?(Add 및 파일저장) 박지훈.임프 4178 2015/08/22
72922         Re:Re:서브쓰레드에서 Synchronize 함수 호출하여 서버와 통신 중 멈추면 메인쓰레드는 멈추지 않나요? 그린비 4178 2015/08/22
72924             Re:Re:Re:서브쓰레드에서 Synchronize 함수 호출하여 서버와 통신 중 멈추면 메인쓰레드는 멈추지 않나요? 박지훈.임프 4478 2015/08/23
72947                 Re:Re:Re:Re:감사합니다. 많은 도움이 되었습니다~ 그린비 4068 2015/09/01
72925                 Re:Re:Re:Re: Synchronize 함수 호출은 런타임 비용을 많이 치루게 됨 동기화 4454 2015/08/24
72927                     Re:Re:Re:Re:Re: Synchronize 함수 호출은 런타임 비용을 많이 치루게 됨 박지훈.임프 4639 2015/08/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.