이 함수에 문제가 있나요?
글쓴이: lalupo20 / 작성시간: 화, 2018/09/11 - 1:37오후
void GLObjectManager::drawView() { static int prevSize = 0; static int size = 0; list< GLObject* >::iterator obj_iterPos = objList.begin(); list< GLObject* >::iterator obj_iterEnd = objList.end(); for (; obj_iterPos != obj_iterEnd; obj_iterPos++) { size = objList.size(); if (size != prevSize) { obj_iterPos = objList.begin(); obj_iterEnd = objList.end(); prevSize = size; } if (((GLObject*)(*obj_iterPos)) != NULL) ((GLObject*)(*obj_iterPos))->draw(); } }
리스트에는 1초안에 2~3개정도의 객체가 더해지고, 또 제거 됩니다.
이 함수 작동시키다보면 문제없이 잘 돌아갈때도 있고
중간에 에러가 발생하기도 하네요.
일단 문제는 draw()함수 호출하는 부분에서 문제가 발생하네요
(GLObject*)(*obj_iterPos) 이 부분이 널이 되거나 쓰레기값이 들어가면서 문제가 발생하는거 같은데
왜 이런 현상이 발생하는지 모르겠습니다.
조언 좀 부탁드리겠습니다.
Forums:
컴파일 할 때 Error 뿐 아니라 Warning 도
컴파일 할 때 Error 뿐 아니라 Warning 도 살펴보시면 도움이 될 겁니다.
gcc 라면
세벌 https://sebuls.blogspot.kr/
말씀하신 문제의 발생 원인하고는 별개일지도
말씀하신 문제의 발생 원인하고는 별개일지도 모르겠습니다만, 주어진 코드는 멀티스레드 동작을 암시하는군요.
루프가 돌아가는 동안 다른 스레드가 objList에 뭔가 더 삽입하거나 삭제할 수도 있어서 이렇게 작성한 것이겠죠?
STL 컨테이너는 멀티스레딩의 data race에 안전하지 않습니다. 다른 스레드가 objList에 삽입/삭제를 하는 순간에 STL 컨테이너 자료구조가 잠시 일관성을 잃는 모습이 다른 스레드에 노출되거나, 어떤 스레드가 컨테이너의 요소를 사용하려는 순간 다른 스레드가 그것을 삭제해 버릴 수도 있지요.
설명이 너무 추상적이어서 이해를 못 하시겠다면 구체적인 예를 들어 드리죠. 주어진 코드가
if (size != prevSize)
테스트와if (((GLObject*)(*obj_iterPos)) != NULL)
테스트를 통과한 뒤 draw 함수를 호출하기 직전에, 다른 스레드가 바로 그 객체를 objList에서 제거하고 삭제해 버릴 수도 있습니다. 그러면 draw 함수는 삭제된 객체에 대해 호출되겠죠.이런 종류의 문제를 방지하기 위해서 적절한 메커니즘을 도입해야 합니다. 방법은 많습니다. mutex가 대표적이긴 하죠.
아 그럴수 있겠네요.
좋은 댓글 감사드립니다.
참고해보세요.
http://codepad.org/PXetOWlC
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
참고해보겠습니다
감사합니다.
댓글 달기