Thread & memcpy 질문
연다홍
BYTE* pSourceImage;
Multi_Thread_1()
{
소스 이미지의 CRect(100,100,200,200) 부분은 새로운 버퍼에 memcpy 함수를 사용하여 copy;
}
Multi_Thread_2()
{
소스 이미지의 CRect(150,150,250,250) 부분은 새로운 버퍼에 memcpy 함수를 사용하여 copy;
}
Multi_Thread_1()
{
소스 이미지의 CRect(200,200,300,300) 부분은 새로운 버퍼에 memcpy 함수를 사용하여 copy;
}
이런 식으로 멀티 쓰레드 함수를 사용하여 소스 이미지의 여러 부분은 새로운 버퍼에 넣고 싶습니다.
그런데 계속 memcpy 부분에서 알 수 없는 이유로 프로그램이 죽네요...
직접적으로 멀티 쓰레드안의 이 함수에서 죽고 코드는 아래와 같습니다.
BYTE* ImageFunction(BYTE* pSrcImage, CSize sizeSrcImage, CRect rectROI)
{
BYTE* pSrc;
pSrc = NULL;
pSrc = new BYTE[rectROI.Width()*rectROI.Height()]; for(int Row=rectROI.top; RowrectROI.bottom; Row++)
{
memcpy(pSrc + Row * sizeSrcImage.cx,
pSrcImage + rectROI.left + Row * sizeSrcImage.cx, sizeof(BYTE)*rectROI.Width());
}
}
코드는 이런데 이게 멀티 스레드가 아닌 그냥 단일 함수에서는 문제 없이 돌아가는데 멀티 스레드로만 돌리면 꼭 함수가 죽네요...
그래서 로그를 남겨서 봤더니 한 스레드의 memcpy가 실행되던 도중에 다른 스레드의 memcpy도 같이 실행이 됩니다.
그러니까 한 스레드의 memcpy가 끝나기 전에 다른 쓰레드의 memcpy도 동시에 진행이 되고 있는 거죠...
그래서 MSDN에서 찾아보니 memmove 함수가 있다길래 그걸로 해봤는데도 그러고 인텔 라이브러리의 ippsCopy_8u() 함수를 이용해 봐도 결과는 똑같네요...
스레드로 안돌리면 괜찮은데 왜 꼭 멀티 쓰레드에서만 충돌이 날까요?
고수님들 해결 좀 해주세요~! ^^