[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.com/en-us/cpp/parallel/concrt/reference/concurrent-queue-class?redirectedfrom=MSDN&view=vs-2019



댓글

이 블로그의 인기 게시물

[Python] 파이썬에서 Opencv를 이용해 웹캠 영상 읽어오기 및 저장

[MFC] 에디트 컨트롤에 계속 문자열 추가하기(List log)

[Python] OpenCv를 이용하여 마우스 위치 가져오기