Q&A

  • 동기화 질문입니다.(제발 답변좀 부탁합니다.)
indy의 tcpsever의 execute에서 테이블컴포넌트의 findkey를 사용하여

사용자 인증을 합니다.(사용자 id로 find함)

그리고 find한후 클라이언트의 ip를 테이블에 update해 줍니다.

테이블을 사용하므로 sql문으로 처리하지 안고 table.edit .. table.post

이런 식으로 처리하는 기능을 처리하였읍니다.

문제는 여러명일 동시에 접속할경우가 문제인데 find한후 다른 스레드에서

다시 find하므로 ip를 저장할때 실제 find한 위치가 아닐경우가

생깁니다.

어떠게 하면 execute이벤트를 동기화 시킬수 있을까요?

CriticalSectiont사용시 어느 시점에서 InitializeCriticalSection()를

수행하고 DeleteCriticalSection()을 수행해야 하죠?

Execute이벤트 내에서

InitializeCriticalSection(cs);

EnterCriticalSection(CS); .

.

.

LeaveCriticalSection(CS);

DeleteCriticalSection(CS)

위와같이 처리 했더니 안되더군요.

뮤텍스로도 위와 비슷하게 구현했더니 또 실패!

고수님들의 도움을 간절히 기다리겠읍니다.



2  COMMENTS
  • Profile
    토맛토 2001.06.28 22:28
    CriticalSection을 사용하실 때 동기화가 되어야 할 부분에



    InitializeCriticalSection(cs);

    DeleteCriticalSection(CS)



    등의 코드를 사용하시면 안됩니다.

    위의 함수들은 하나의 크리티컬섹션을 만들어서 처음 사용하고자 할 때와 그 크리티컬 섹션을 해제한 후 클리티컬 섹션을 없앨 때 사용합니다.



    보여주신 코드의 execute는 서로다른 여러개의 쓰레드에 의해 실행되므로 각 쓰레드마다 서로다른 크리티컬 섹션을 만들어 사용하게 되는 셈이죠 크리티컬섹션은 자바의 synchronize(object){...}와 같이 크리티컬섹션 객체를 잠그고 코드를 실행한 후 잠금을 해제하고 코드를 빠져나오는 것이라고 생각하시면 됩니다.



    크리티컬섹션 코드의 순서는 execute를 실행하기 전에 전역변수와 같은 크리티컬섹션을 만들고(InitializeCriticalSection) 프로그램이 끝날때 또는 더이상 동기화 작업이 필요없을 때 크리티컬섹션을 지웁니다.(DeleteCriticalSection)

    그리고 동기화 코드는 EnterCriticalSection...LeaveCriticalSection으로만 처리합니다.



    델파이에는 이미 TCriticalSection이라는 클래스가 있습니다. CriticalSection API를 wrapping한 것이니까 부담없이 사용하시면 되고요.



    전역변수로 선언하시고 프로그램 초기화에서 TCriticalSection.Create(CreateCriticalSection과 같음)로 생성한 후

    동기화 과정시에는 TCriticalSection.Acquire또는 TCriticalSection.Enter (EnterCriticalSection 과 같음)와 TCriticalSection.Release 또는 TCriticalSection.Leave(LeaveCriticalSection과 같음)으로 처리,

    마지막 프로그램 종료시에 TCriticalSection.free(DeleteCriticalSection과 같음)로 마무리합니다.





    철 wrote:

    > indy의 tcpsever의 execute에서 테이블컴포넌트의 findkey를 사용하여

    > 사용자 인증을 합니다.(사용자 id로 find함)

    > 그리고 find한후 클라이언트의 ip를 테이블에 update해 줍니다.

    > 테이블을 사용하므로 sql문으로 처리하지 안고 table.edit .. table.post

    > 이런 식으로 처리하는 기능을 처리하였읍니다.

    > 문제는 여러명일 동시에 접속할경우가 문제인데 find한후 다른 스레드에서

    > 다시 find하므로 ip를 저장할때 실제 find한 위치가 아닐경우가

    > 생깁니다.

    > 어떠게 하면 execute이벤트를 동기화 시킬수 있을까요?

    > CriticalSectiont사용시 어느 시점에서 InitializeCriticalSection()를

    > 수행하고 DeleteCriticalSection()을 수행해야 하죠?

    > Execute이벤트 내에서

    > InitializeCriticalSection(cs);

    > EnterCriticalSection(CS); .

    > .

    > .

    > LeaveCriticalSection(CS);

    > DeleteCriticalSection(CS)

    > 위와같이 처리 했더니 안되더군요.

    > 뮤텍스로도 위와 비슷하게 구현했더니 또 실패!

    > 고수님들의 도움을 간절히 기다리겠읍니다.

    >

  • Profile
    2001.06.28 23:17
    토맛토님 답변해 주셔서 정말 고맙습니다^^

    많은 도움이 되었읍니다.