라벨이 멀티쓰레드인 게시물 표시

[MFC] 멀티쓰레드에서 사용하기 좋은 QUEUE (concurrent_queue)

 라인 스캔 카메라를 고속으로 사용할 일이 있어 스캔 속도를 높였더니   이미지가 뒤죽박죽이 되는 현상이 발생하였다.   아무래도 이미지를 합치기 위해 한 줄씩 카피하다보니 메모리에서 이미지 카피 속도 보다   카메라에서 던지는 속도가 더 빠른듯 하다.   일단 카메라에서 받는 이미지를 concurrent_queue 에 넣고    다른 쓰레드에서 이를 빼서 처리하는 방식으로 코드를 수정하였다.   concurrent_queue 는 멀티 쓰레드에서 사용하기 편한 Queue 로    Push 나 try_pop 을 할 때 다른 쓰레드에서의 접근을 신경쓰지 않아도 된다. CCriticalSection 을 Lock, Unlock 하지 않아도 된다는 말씀! 검색해본 결과 empty, push, get_allocator, try_pop 함수만 쓰레드 세이프 하고   다른 함수들은 접근하고 있는 쓰레드의 유무에 따라 값이 바뀔수도 있다고 한다. 사용법은 concurrent_queue<template> _QUEUE; 로 선언 후 _QUEUE.push( 객체 ); 로 push _QUEUE.try_pop(&객체) 로 Pop 하여 사용하면 된다.   #include < concurrent_queue . h > concurrent_queue<int> _QUEUE;   _QUEUE.push(1);  int a = 0; _QUEUE.try_pop(&a); --- 추가 --- 생각대로는 잘 안된다. push는 모르겠는네 try_pop 과 empty 가 동시에 두 개 이상 쓰레드에서 진행될 때  문제가 발생했다. empty로 동시에 접근하고 try_pop 할 때 문제가 발생한다;;;   어쩔 수 없이 Lock과 Unlock 을 사용하여 문제를 해결하여 사용중이다.   조금 더 공부가 필요할 것 같다. [출처] : http://egloos.zum.com/sweeper/v/3053916 [출처] : https://docs.microsoft

[MFC] CCriticalSection 로 공유 메모리 동시 접근 막기

멀티 쓰레드 코딩을 하다보면 쓰레드에서 공유 메모리(데이터)에 접근할 일이 많이 생긴다 이럴때 시간 순서대로 순차적으로 접근할 수도 있겠지만 동시에 같은 메모리나 데이터에 접근하여 데이터 수정 및 읽기가 진행되는 경우 데이터에 대한 오류가 발생한다 이를 방지하기 위해 MFC에서 사용 하는 것이 CCriticalSection 클래스이다. 사용 방법은 간단하다. CCriticalSection를 멤버 변수나 지역 변수로 선언해서 공유 메모리에 접근할 때 Lock() 함수를 호출 하고 사용이 끝난뒤에 Unlock() 함수를 호출하면 된다.  ex) CCriticalSection m_cs;              // CCriticalSection 객체 선언 int m_nShareData;                  // 공유 메모리 선언 m_cs.Lock();  m_nShareData + 2; // 공유 메모리 작업 실행          .          . m_cs.Unlock(); 이런식으로 작성하면 동시에 공유 메모리에 접근하는 것을 막아준다.