2010-11-27 1 views
0

저는 MacOS와 Linux에서 잘 돌아가며 mingw로 Windows로 크로스 컴파일하는 프로그램을 가지고 있습니다. 최근에 프로그램을 멀티 스레드로 만들었습니다.메인 스레드에서 alloc()을 수행하고 다른 스레드에서 free()를 수행 할 수 있습니까?

프로그램의 현재 디자인은 주 스레드에서 할당 된 메모리를 가지며 슬레이브 "worker"스레드에서 해제됩니다. malloc/free 시스템이 멀티 스레드이므로 MacOS 및 Linux에서는 문제가되지 않습니다.

그러나 크로스 컴파일에 대해 우려하고 있습니다. 내가 사용하고있는 mingw의 버전은 MacOS 포트에서 만들어졌습니다. 그것은 2004 년부터 G ++ (3.4.5 버전)의 아주 오래된 버전입니다. 나는 더 최근 버전을 만들기위한 시도에서 실패했습니다. (저는 64 비트 버전을 만들고 싶습니다.하지만 포기했습니다.) 나는 http://sourceware.org/pthreads-win32에서 pthreads를 얻고 있습니다.

내 관심사는 3.4.5의 malloc & 무료 시스템이 멀티 스레드가 아닙니다.

질문 : 메모리 블록이 해제 될 메인 스레드에 다시 전달 해방 될 수 있도록

  1. 내가 내 프로그램을 다시 작성해야 하는가?

  2. 더 최근의 윙으로 업그레이드해야합니까?

  3. 방대한 양의 테스트 이외에 이러한 동시성 문제를 찾는 방법이 있습니까? 그것은 저에게 좋은 느낌이 들지 않습니다.

고마워요!

+0

그래서 되돌아 보면 옵션 # 1이 작동하지 않는다고 결론을 냈습니다. 왜냐하면 malloc() 및 free()가 호출되어야하는 스레드에는 다른 많은 경우가 있기 때문입니다. 나는 각 스레드에게 자신의 메모리 할당자를 줄 수는 있지만 잘못된 방향이다. – vy32

답변

1

왜 malloc &은 멀티 스레드되지 않았습니까?

기본적으로 mingw32는 다중 스레드 dll 인 msvcrt.dll과 연결됩니다. [1] 참조. 거기에 [2] Microsoft에서 제공하는 단일 스레드 라이브러리 였지만 정적 연결에서만 사용할 수있었습니다.

추 신 : 당신은 크로스 컴파일 중이라고 말하지만 대신 Windows에서 Windows 프로그램을 컴파일하는 것처럼 보입니다. 그런 경우 www.mingw.org에서 바이너리를 왜 다운로드하지 않습니까?

2

1 http://msdn.microsoft.com/en-us/library/abx4dbyh%28v=VS.71%29.aspx는 참조 (그것이 비록 자신의 다운로드 필요한 파일에 알아낼 수있는 고통) [1]. Visual Studio 2005에서 제거되었습니다. http : // msdn.microsoft.com/en-us/library/abx4dbyh%28v=VS.80%29.aspx

+0

사실, 이것이 정답이며 이것이 시스템을 구현 한 방법입니다. 나는 제작자 스레드에서 할당하고 소비자 스레드에서 해제하고 있습니다. malloc 및 free는 다중 스레드입니다. 그것은 모두 완벽하게 작동합니다. 매우 깨끗합니다. – vy32

+0

덧글을 계속하기 위해 원래 Mingw 버전 3.x 컴파일러를 사용하여 Mac에서 Windows로 크로스 컴파일했습니다. 그러나 4.x 컴파일러가 더 좋으며 호스트 만 실행되기 때문에 바이너리를 다운로드 했으므로 제대로 작동합니다. 하지만 컴파일이 좀 더 복잡해집니다. – vy32

1
  1. 나는 이것을 피합니다. 당신이 주요 문제를 피하는 것처럼 들리 네요.
  2. 예, 좋은 생각입니다.
  3. 메모리 할당/할당 해제와 관련된 동시성 문제를 감지하는 한 가지 방법은 메모리 누수 감지입니다. valgrind가 cygwin에서 작동하는지 잘 모르겠습니다.
+0

cygwin을 사용하고 있지 않습니다. mingw를 사용하고 있습니다. 최신 버전으로 업그레이드하는 것에 대단히 기쁩니다. Mac 또는 Linux에서 어떻게 구축 할 수 있습니까? http : //www.mingw.org/wiki/LinuxCrossMinGW, "이 글을 쓰고있는 시점에서, MinGW 프로젝트는 모든 플랫폼에서 MinGW 개발 도구로 사용할 수있는 GCC 공식 빌드를 지원하지 않습니다 (GCC-3.4.5 이상). 공식적으로 지원되는 안정적인 GCC-4.x 버전이 공개 될 때까지 MS-Windows 플랫폼에서 기본으로 사용하기 위해 변경해야합니다. " – vy32

+0

Ick, 실망 스럽다. GCC 4가 몇 년 동안 있었는지 생각해 보라. Windows에서 Microsoft 도구를 사용하지 못하게하는 응용 프로그램의 특성이 있습니까? – Reinderien

+0

프로그램은 GNU flex, automake 및 기타 도구로 빌드됩니다. 과거에 VC++ 및 GCC에서 교차 컴파일하는 코드를 유지했지만 VC++ 버전은 항상 뒤에 있습니다. mingw와 cygwin에 대한 좋은 점은 동일한 툴 체인을 사용하여 두 플랫폼 모두에서 프로그램을 제공 할 수 있다는 것입니다. Mingw 또는 Cygwin과 함께 멀티 스레딩 솔루션을 찾기 위해 * long * 시간을 보냅니다. – vy32

관련 문제