Q&A

  • DLL 전역변수 문의
DLL 내에 전역변수 aaa 라는 것을 선언했습니다..

DLL 호출하는 쪽에서 2~3개의 쓰레드가 동시에 실행되어 DLL 를 호출해서 사용할때

DLL 내의 전역변수 aaa 각 쓰레드에 의해 간섭이 발생할 수 있는가요?

DLL 에서 호출하는 쪽에서는 STATIC 하게 DLL을 load 합니다..

그리고, DLL 내의 함수를 호출하게 되면 전역변수 aaa 라는 값은 초기화, 값 저장 등의

변수값 변화가 발생합니다..

DLL 를 개발해서 업체에 제공을 했는데, 업체의 프로그램은 쓰레드 방식으로 저희  DLL를 호출한다고 합니다..

그런데, 쓰레드가 여러개 실행되어 작업을 돌때 전역변수 값이 예상하지 못하는 값으로 리턴이 되어 질문을 드리게 되었습니다..
4  COMMENTS
  • Profile
    구창민 2008.05.23 23:25

    안녕하세요..

    아래와 같이 설명되어 지구 있습니다..

    ◇ DLL에서의 전역변수

    DLL에서 선언된 전역변수는 단지 DLL안에서만 인식된다. DLL은 자신을  호출하는
    모듈의 변수를 읽을 수도 없고, 자신의 변수를 export하여 다른 모듈에서 읽도록
    할 수도 없다. DLL에서 가능한 인터페이스는 procedure나 function 뿐이기  때문
    이다. 따라서 상호간의 변수값 참조는 function이나 procedure의 인자, 반환값등
    에 의존할 수밖에 없다. 또 하나 주의해야 할 것은 DLL 자체는 메모리상에 하나
    만 유지되지만, 그 Instance는 각각의  전역변수 테이블을 가진다. 다시말해  두
    어플리케이션이 동시에 하나의 DLL을 억세스할 때도 전역변수는 각각에 따라  개
    별로 구성된다. 메모리의 공유를 위해서는 Windows API중 Memory Mapped  File을
    이용해야 한다.



  • Profile
    강신구 2008.05.23 23:36
    답변에 감사드립니다..

    한가지 더 문의 드리고 싶은데요..

    아래 설명에 따르면.. 제가 문의드린 내용은 발생하지 않아야 할 것 같은데요..

    그래서.. 아래 설명의 어플리케이션은 별개로 실행된 각각의 프로그램을 지칭하는 것인지요?

    제가 문의드린 내용은 하나의 어플리케이션에서 실행된 쓰레드에 대해 문의를 드렸거든요..

    변수 aaa 가 DLL 내에서 전역변수로 선언되어 있는데요..

    1번 쓰레드와 2번 쓰레드가 동시에 구동되어 1번이 aaa 에 값을 1을 저장하고, 2번이 aaa 값을 초기화 했거든요..

    그러고 나서.. 2번 쓰레드가 먼저 작업 마치고 종료하고, 1번이 작업을 마치고 종료를 했는데요..

    1번이 작업 종료후의 aaa 값을 리턴 받아 봤는데.. 값이 초기화 되어 있었습니다..

    그래서.. 아래의 질문을 올렸던거구요..

    DLL 내의 전역변수에 대해 쓰레드는 값은 메모리를 참조하는지 궁금합니다..

    아주 민감한 사항에 부딪쳐서.. 골치아픕니다.. 도와주세요..
  • Profile
    구창민 2008.05.24 02:03
    음.. DLL 내의 전역변수를 쓰레드에서 다루어 본적이 없어서 ..쩝..

    간단한 문제가 아닌거 같네요..

    우선.. 어플에서 어떻게 DLL 을 로딩해서 쓰레드에서 사용하는지 제가 알수가 없으니 ...

    두개의 쓰레드에서 동시에 DLL 의 전역변수를 확실히 억세쓰하게 되어지는것인지 확인을 하는것이 먼저같습니다.

    쓰레드를 하나 실행하셔서 결과값을 받아보시고 다시 다음 쓰레드를 실행해보시고

    거기까지 하셔서 정상적인 결과를 받으셨다면,

    동시에 실행하셨을때 결과를 확인해보시구...결과가 다르다면

    일반적으로 DLL 의 각기다른 전역변수 인스탄스가 생긴다는 것과는 다르다는 결론을 내릴 수 밖에 없는데,

    위와같은 경우는 경험해본적이 없어서요...

    위의 경우, 동시에 접근했다고 가정.. 쓰레드의 우선순위 문제라고 판단..
    (쓰레드의 우선순위 경우 cpu 의 종류와 역할에 따라 달라진다고 합니다..)

    쓰레드에서 동기화 작업은 크리티칼섹션이나 싱크로나이즈로 하면 되는데..

    저는 DLL 내부의 전역변수를 쓰레드에서 억세스하게 될때의 동기화를 처리해본적은 없네요..

    제가 테스트를 해보구 말씀드려야 하는건데 저두 파견나와있는 처지라 ..

    쩝..뭐하나 시원히 답변못드리고 두리뭉실하게 답변드릴수 밖에 없어 죄송하네요...

    암튼 우선 테스트를 해보시길 바랍니다.. 저두 결과가 궁금하네요..


  • Profile
    steps 2008.05.24 00:05
    질문에
    1번이 작업 종료후의 aaa 값을 리턴 받아 봤는데.. 값이 초기화 되어 있었습니다..
    라고 되여있는데 쓰레드들에서 각기 dll을 로딩했었다면 쓰레드종료후에 당연히 초기화되지 않는가요?
    애플리케이션과 쓰레드들에서 dll의 로딩방법, 로딩과 해제시점이 문제인것같은데요.
    • 유경민
    • 2008.05.29 07:06
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.05.29 13:53
      http://www.codegear.com/downloads/regusers/delphi http://download.borlandforum.com/delphi/Delph...
    • 구창민
      2008.05.29 20:22
      이곳 자료실에 가셔서 'delphi 6' 으로 검색해보시면 두개의 업뎃팩을 보실 수 있을겁니다. 즐거운 프...
    • 유경민
      2008.06.03 06:56
      감사합니다~
    • 홍성락
      2008.05.29 04:56
      delmadang에 [민성기]님이 올리신 소스가 있어요. 질문과 답변 {[추가] 프린터 추가 마법사~ ^^} 제목입...
    • 공성환
      2008.05.29 00:55
      FormatFloat 함수를 이용하셔도 될것같은데요... ShowMessage(FormatFloat('#,##0.0',7.0));
    • 강태원
      2008.05.29 02:31
      앗.... 그런 함수도 있군요!! 잘 동작 하네요. 알려주셔서 감사합니다.^^
    • 석주현
      2008.05.29 13:59
      전 주로 그냥 format 함수를 사용합니다. format('%2.1f',[7.0]); 보통 C 에서 쓰는 printf 와 비...
    • 강태원
      2008.06.10 02:52
      소나기님이 알려주신 방법도 좋을듯 하네요. 진작 알았으면 사용해 보는건데... 다음 프로젝트때 ...
    • 루루
    • 2008.05.28 04:20
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 루루
      2008.05.29 04:36
      답답해서 progdigy.com 을 뒤져 봤더니 비슷한 어려움을 겪은 케이스가 있었네요만, 그 해결책에 대한 답...
    • 루루
      2008.06.04 04:36
      ATi 라데온의 듀얼모니터 Threater 기능때문에 DSPACK234의 일부기능이 오작동 하는 것 같습니다. 지포...
    • 홍성락
    • 2008.05.29 00:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 화이팅
    • 2008.05.28 00:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2008.05.28 01:40
      안녕하세요.. MDI 프로젝트에 대한 개념을 잡는 것이 먼저인것 같습니다.. 아래 내용을 숙독하시면...
    • steps
      2008.05.28 08:11
      제가 잘못 리해하지않았는지. 혹 string이나 widestring을 utf8로 남기는게 목적이라면 델파이의 UTF8Enc...
    • 이정욱
      2008.05.27 13:55
      아마 컴포넌트가 제데로 설치 되지 않은것 같습니다. 설치 방법이 있는 텍스트 파일을 잘 읽어보시고 ...
    • 석주현
      2008.05.27 15:51
      정확한 에러 메세지를 알려 주셔야 말씀을 드릴 수 있을 것 같습니다. 일단 이정욱님 말씀처럼 컴포넌...
    • steps
      2008.05.27 19:56
      저는 제오스6.61베타를 쓰는데요. 일단 packages 폴더안에서 component.dpk를 찾아 컴파일하고 그 다음...
    • 이정욱
      2008.05.27 13:56
      마이빌더가.. 뭔가요? ^^; 어디서 볼수 있는것인지.. 또 어떤프로그램인지 알아야 도움을 드릴 수 있을 ...
    • 가을바람
      2008.05.27 18:26
      덕분에 마이빌더가 뭔지알겠되었네요.. 좋아보이네요.. "마이빌더"로 검색해보시길.. 개발사홈피보면 델...
    • 이정욱
      2008.05.27 13:59
      코드로는 알려드리기가 힘들지만... XML 은 기본적으로 델파이에서 파싱이 가능합니다. XML을 읽어서....
    • 최용일
      2008.05.27 00:44
      uses절에 windows유닛을 추가하세요. CreateMutex함수는 windows유닛에 있습니다.
    • dbwrite
      2008.05.30 05:33
      예전에 CreateMutex를 이용하여 처리 하다 중복으로 실행 (프로그램을 잘못짜서그런지 )되는경우가 있어 ...
    • 최용일
      2008.05.26 20:03
      xFrame, yFrame 변수가 nil인지 체크해보세요...
    • 미닛메이드
      2008.05.26 20:35
      변수가 nil이란것이 정확히 어떤것인지 모르겠네요;;; frame에서 변수라는것이 정확히 어떤것이죠?
    • 깔쌈보이
      2008.05.26 20:50
      xFrame, xForm <= 이 것 역시 변수라고 볼 수가 있습니다. 근데 설마, xFrame, xForm이 클래스 명칭...
    • 미닛메이드
      2008.05.26 23:11
      type TfrmChat = class(TTntForm) //위에서 말한 xForm 클래스 구현부분 fmChatRo...
    • 미닛메이드
      2008.05.26 23:12
      xForm, xFrame, yFrame 등은 파일이름입니다. fmChatRoom 은 폼 이름
    • 이정욱
      2008.05.26 23:41
      위의 질문에서는 사실 잘못된 점을 꼬집어 드릴수 없을것 같습니다. 엑세스 바이올레이션 에러는 선언...
    • 한상훈
    • 2008.05.26 09:10
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.05.26 11:12
      질문이 잘 이해가 안가지만.. 아이템의 StateIndex 값을 조절 하시면 됩니다.
    • 한상훈
      2008.05.26 22:47
      예를들어 ListView1.SmallImages:=ImageList1; ListView1.StateImages:=ImageList1; 여기서 Imag...
    • 김병윤
      2008.05.25 01:16
      그냥 윈도우에 작업을 등록해서 사용하시면 될 듯 보이는데 굳이 델파이 코드로 등록을 해야할까요? 제...
    • steps
      2008.05.25 01:28
      앞으로의 배포문제를 념두에 두고 저에게 준 과제입니다. 사용자보고 인스탈후에 제어판의 scheduled ta...
    • 김병윤
      2008.05.25 02:08
      어차피 인스톨한 어플에서 등록을 하더라도 윈도우 스케줄러에 등록하려면 로그인 계정이 누구인지 알고...
    • steps
      2008.05.25 03:46
      당장은 가르쳐주신대로 콘솔호출방식을 리용하렵니다. http://www.Planet-Source-Code.com/vb/scripts/S...
    • 이정욱
      2008.05.25 09:09
      배포하시기에 더 좋은 방법은 그 어플리케이션을 서비스 형태로 만드셔서 특정시간에 쿼리를 수행하게 하...
    • 구창민
      2008.05.26 06:36
      안녕하세요..아래 내용을 참고 하세요... unit Unit1; interface uses Windows, Messages,...
    • steps
      2008.05.27 00:34
      이종욱님 구창민님 정말 감사합니다. 귀한 시간 내시여 래핑까지 해주신 창민님께 다시 한번 인사드립니다.
    • • • •
    • 이정욱
      2008.05.24 20:28
      Implementation 위쪽에 선언해주세요 ^^ 밑쪽에 있으면, 그 유닛 안에서만 참조가 가능합니다.
    • 이정욱
      2008.05.25 00:32
      BDE는 제가 오랫동안 안해서.. 기억이 하나도 나질 않네요.. 시간이 좀 있으시다면 ODAC 라는 써드파...
    • 강신구
    • 2008.05.23 23:13
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2008.05.23 23:25
      안녕하세요.. 아래와 같이 설명되어 지구 있습니다.. ◇ DLL에서의 전역변수 DLL에서 선언된 전...
    • 강신구
      2008.05.23 23:36
      답변에 감사드립니다.. 한가지 더 문의 드리고 싶은데요.. 아래 설명에 따르면.. 제가 문의드린 내용...
    • 구창민
      2008.05.24 02:03
      음.. DLL 내의 전역변수를 쓰레드에서 다루어 본적이 없어서 ..쩝.. 간단한 문제가 아닌거 같네요.. ...
    • steps
      2008.05.24 00:05
      질문에 1번이 작업 종료후의 aaa 값을 리턴 받아 봤는데.. 값이 초기화 되어 있었습니다.. 라고 되여있...
    • 김원기
    • 2008.05.23 00:11
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.05.23 08:40
      지금 열려 있는 코드들이 어디에 저장되어 있는지 확인해 보세요. 혹시라도 프로젝트를 카피해서 다른 ...
    • 머문자리
      2008.05.26 18:19
      흠.. 저도 소스를 복사해서 업데이트 하다가 원본실행파일만 실행시킨 어처구니 없는 일들이 기억이 나네...
    • 김원기
      2008.06.18 20:13
      감사 해요. 감사 합니다. 이제야 감사하다는 말을 남기네요 ㅠㅠ 바뻐서.. 나중에 남긴다는 말을.....