none
[VS2010]다중스레드(/MT)와 다중스레드 디버그(/MTd)의 차이점? RRS feed

  • 질문

  • 안녕하십니까. 개발자 여러분!

    정적 링크에 질문이 있습니다.

    VS2010 버전으로 API 프로그램을 하고 있습니다.

    그리고 컴파일을 정적(/MT)으로 하면 오류 메시지가 나옵니다. 하지만 다중 스레드 디버그(/MTd)를 하면 오류없이 잘 동작이 되며 또한, (/MD) 나 (/MDd)가 아니기 때문에 msvcp100.dll 이게 필요없습니다. 

    1. 여기서, 다중스레드(/MT)와 다중스레드 디버그(/MTd)의 차이점이 무엇인가요?
    2. 컴파일은 릴리즈로 하고 런 타임 라이브러리는 /MTd 로 하면 어떻게 되나요??

    3. 배포하는데 문제가 없나요??

    2012년 4월 4일 수요일 오전 7:25

답변

  • 대부분 이런경우 자신이 작성한 코드에서 메모리 관리하는 부분에 문제가 있거나 자신이 사용한 클래스가 구조적으로
    맞지 않아서 발생합니다. 메모리 할당 또는 해제를 정확하게 했다고 생각하셔도 특정 메모리를 여러개의 스레드가 동시에
    이용하도록 되어 있는경우는 크리티컬 섹션을 이용하여 충돌나지 않도록 주의 하셔야 합니다. 그리고 스레드 기동 함수는 API 계열을
    사용하면서 스레드가 사용할 함수내에서 CString 과 같은 MFC 클래스를 사용하면 이런 문제가 발생하기도 합니다.

    /MT 대신 /MTd 로 컴파일하면 일단 실행파일의 크기 커질것이고 관련 코드에 대한 최적화가 진행되지 않기 때문에
    동작효율이 떨어지긴 하겠지만 배포하는데 문제는 없을겁니다. 하지만, 이런 문제보다는 /MT 로 했을때 오류가 난다면
    내부적으로 코드에 문제가 있다는 뜻이기 때문에 반드시 해결하시는게 나중에 좋을것입니다.

     

    메모리 할당/해제를 중심으로 오류가 없는지 여부, 사용한 크기가 할당된 크기를 넘어서는 경우가 없는지 여부,
    동일한 메모리를 여러개의 스레드가 같이 사용한다면 충돌이 없는지 여부, 구조적으로 API 함수로 스레드를
    호출하면서 내부에 MFC 클래스를 사용했는지 여부를 체크하셔서 해결하시는게 좋습니다.


    2012년 4월 4일 수요일 오전 8:49
    중재자
  • 아, 제가 질문을 착각했네요 ㅎㅎ...

      

    해당 제조회사에서 lib 를 수정해줄수 없는 상황이라면 방법이 없을듯하네요. 그냥 /MTd 로 하셔야겠네요.
    수정을 요구할수 있는 상황이면 반드시 요구하셔서 수정을 받으시고 관련된 프로그램을 계속 하셔야 한다면
    대체 가능한 라이브러리가 있는지도 미리 알아보시는게 좋을듯합니다~


    • 편집됨 tipswareMVP, Moderator 2012년 4월 4일 수요일 오전 9:49
    • 답변으로 표시됨 9SkyGround 2012년 4월 4일 수요일 오후 11:47
    • 답변으로 표시 취소됨 9SkyGround 2012년 4월 5일 목요일 오전 12:03
    • 답변으로 표시됨 9SkyGround 2012년 4월 5일 목요일 오전 12:04
    2012년 4월 4일 수요일 오전 9:47
    중재자

모든 응답

  • 대부분 이런경우 자신이 작성한 코드에서 메모리 관리하는 부분에 문제가 있거나 자신이 사용한 클래스가 구조적으로
    맞지 않아서 발생합니다. 메모리 할당 또는 해제를 정확하게 했다고 생각하셔도 특정 메모리를 여러개의 스레드가 동시에
    이용하도록 되어 있는경우는 크리티컬 섹션을 이용하여 충돌나지 않도록 주의 하셔야 합니다. 그리고 스레드 기동 함수는 API 계열을
    사용하면서 스레드가 사용할 함수내에서 CString 과 같은 MFC 클래스를 사용하면 이런 문제가 발생하기도 합니다.

    /MT 대신 /MTd 로 컴파일하면 일단 실행파일의 크기 커질것이고 관련 코드에 대한 최적화가 진행되지 않기 때문에
    동작효율이 떨어지긴 하겠지만 배포하는데 문제는 없을겁니다. 하지만, 이런 문제보다는 /MT 로 했을때 오류가 난다면
    내부적으로 코드에 문제가 있다는 뜻이기 때문에 반드시 해결하시는게 나중에 좋을것입니다.

     

    메모리 할당/해제를 중심으로 오류가 없는지 여부, 사용한 크기가 할당된 크기를 넘어서는 경우가 없는지 여부,
    동일한 메모리를 여러개의 스레드가 같이 사용한다면 충돌이 없는지 여부, 구조적으로 API 함수로 스레드를
    호출하면서 내부에 MFC 클래스를 사용했는지 여부를 체크하셔서 해결하시는게 좋습니다.


    2012년 4월 4일 수요일 오전 8:49
    중재자
  • API 함수로 쓰레드를 호출하면서 내부 함수들은 MFC 가 아닌 제조회사에서 배포하는 lib 입니다.

    현재 lib 에서 /MT 로 하면 오류가 됩니다.

    P.s: free, memset, malloc, atof 를 API로 변경해야 되나요??

    

    2012년 4월 4일 수요일 오전 9:33
  • 아, 제가 질문을 착각했네요 ㅎㅎ...

      

    해당 제조회사에서 lib 를 수정해줄수 없는 상황이라면 방법이 없을듯하네요. 그냥 /MTd 로 하셔야겠네요.
    수정을 요구할수 있는 상황이면 반드시 요구하셔서 수정을 받으시고 관련된 프로그램을 계속 하셔야 한다면
    대체 가능한 라이브러리가 있는지도 미리 알아보시는게 좋을듯합니다~


    • 편집됨 tipswareMVP, Moderator 2012년 4월 4일 수요일 오전 9:49
    • 답변으로 표시됨 9SkyGround 2012년 4월 4일 수요일 오후 11:47
    • 답변으로 표시 취소됨 9SkyGround 2012년 4월 5일 목요일 오전 12:03
    • 답변으로 표시됨 9SkyGround 2012년 4월 5일 목요일 오전 12:04
    2012년 4월 4일 수요일 오전 9:47
    중재자
  • 아래 그림처럼 하고 /MT로 컴파일 하니 해결이 되었습니다.

    의미하는 바는 잘 모르겠습니다.....

    2012년 4월 5일 목요일 오전 12:05