CriticalSection : 하나의 Process에서 여러개의 Thread의 상호배제 구현 선언 : CRITICAL_SECTION m_CrtSection; 초기 : 생성 : InitializeCriticalSectionAndSpinCount(&m_CrtSection, 2000);//Multi CPU를 지원 Spin Count를 추가 한다. 진입 : EnterCriticalSection(&m_CrtSection); 진출 : LeaveCriticalSection(&m_CrtSection); 소멸 : DeleteCriticalSection(&m_CrtSection);
Mutex : 이름을 지정하여 여러개의 Process의 Thread에서도 상호배제 가능.Mutex는 동기화 대상이 오직 하나뿐일 때 선언 : HANDLE m_hMutex; 초기 : m_hMutex=NULL; 생성 : m_hMutex=CreateMutex(NULL,FALSE,NULL); //OpenMutex() 진입 : WaitForSingleObject(m_hMutex,INFINITE); 진출 : ReleaseMutex(m_hMutex); 소멸 : if(m_hMutex !=NULL ) CloseHandle(m_hMutex);
Semaphore : 여러 Process의 한가지 자원에 접근 배제.Semaphore는 동기화 대상이 하나 이상일 때 사용 선언 : HANDLE m_hSemaphore; 초기 : m_hSemaphore=NULL; 생성 : m_hSemaphore= CreateSemaphore( NULL, // default security attributes 3, // initial count. MAX_COUNT 10 3, // maximum count. MAX_COUNT 10 NULL); // unnamed semaphore
WaitForMultipleObjects(5, &aThread[0], TRUE, INFINITE); 진입 : dwWaitResult = WaitForSingleObject( m_hSemaphore, // handle to semaphore 0L); // zero-second time-out interval // Return value : 리턴값 ( dwWaitResult 에 저장되는 값 ) // WAIT_ABANDONED 0x00000080L // WAIT_OBJECT_0 0X00000000L // WAIT_TIMEOUT 0x00000102L // WAIT_FAILED 0xFFFFFFFF(DWORD) 진출 : ReleaseSemaphore(m_hSemaphore, // handle to semaphore 1, // increase count by one NULL) ) // not interested in previous count
Event 선언 : HANDLE m_hEvent; 초기 : m_hEvent=NULL; 생성 : m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); ResetEvent(m_hEvent); 진입 : WaitForSingleObject(pDlg->m_hEvent, INFINITE); 진출 : ResetEvent( hHandle );// 원하는 작업을 처리한다. 소멸 : if(hHandle !=NULL ) CloseHandle(hHandle);
이벤트 발생은 SetEvent(m_hEvent); //return value
WAIT_FAILED : fail, GetLastError로 원인을 알수가 있다 이경우 logic을 빠져나간다 WAIT_ABANDONED : 이 경우는 Event Object를 reset 하고 다시 WaitForSingleObject()를 호출한다 WAIT_OBJECT_0 : 기다리던 Event가 signal 된 경우 WATI_TIMEOUT : time-out 된 경우
Opencv 3.4 이후 문제점. (제공 버전과 Source Build를 통해 Test를 진행하였다. 4.1.2, 3.8.4, 3.4.0 )
- Memory Leak이 있다.(단지 링크 순서에 의한 것이라지만-Debug상)
OpneCV 진영의 먹칠(??)이다 ㅡ.ㅡ;
조치 1) Static MFC DLL로 조치 --> cv::Mat을 사용할 때 __acrt_first_block == header heap Error 발생.(debug에서만 발생.) (사용 불가.) --> Local Project는 Debug이지만 Dll은 신뢰 하영 Release로 Link시 사용하는 Opencv C++ Class Link error 발생. (사용 불가.)
조치 2) 모두 동적 Link로 Build 지연된 DLL로 변경. 프로그램 시작(동작 없이) 종료 시 Leak 없음. -->cv::Mat Class 함수 호출 IplImage 사용호 종료 시 Memory Leak 발생.
결론 현재 VS2017로 컴파일하는 3.2 버전 이상에서는 => Memory Leak을 조치하면, __acrt_first_block == header 발생으로 C++Mat를 사용할 수 없다. => 다중 스레드 디버그(/MTd and /MT)에서 그나마 유연하게 동작한다. (__acrt_first_block == header를 발생시키는 코드도 있다.) => 3.2 이상 버전으로 갈수록 C++형태의 코드와 더 많은 STL사용으로 컴파일 강도가 높아지고 있는 듯하다.
다른 분들은 어떠실지 모르지만 현재 3.2 버전 이후에는 Memory Leak, Heap에러의 조치가 없다면, 버전업을 할 수 없을 듯하다. - 가짜 Memory Leak은 Main S/W Debugging을 힘들게 한다. - Heap에러는 S/W 신뢰도를 떨어뜨린다.
5) button Generate 진행 6) button Open Project 진행 7) Visual Studio Debug/Release 컴파일 진행. 8) 프로젝트중 "INSTALL"프로젝트만 따로 Build 진행. -> 위에서 선택한 결과 폴더에 결과물이 저장된다. 특히 "include"폴더 필요.
Local Project 만들기.(EXE, DLL) - Opencv의 Link혹은 Process오류(에러)를 제거 하기위해. 되도록 Link 구조는 동일 하게 유지 하자. 구성 속성 ->일반 -> MFC 사용 : "공유 DLL에서 MFC 사용" 구성 속성 ->C/C++ ->코드 생성->런타임 라이브러리 :"다중 스레드 디버그 DLL(/MDd and /MT)