2017-01-06 2 views
0

VS2015를 사용 중입니다.릴리스 모드에서 동일 작업이 올바르게 실행되지 않습니다.

루프가 올바르게 작동하는 동안 디버그 모드가 강조 표시되어 있습니다. !P_Object->first_request이 true 일 때 디버깅 모드가 강조 표시됩니다.
그러나 릴리스 모드에서는 동일한 조건이 작동하지 않습니다. 또한 빠른보기에서 Visual Studio 빠른보기가 !P_Object->first_request을 false로 인식하지만 반복되는 반복을 볼 수 있습니다.

BTW : P_Object->first_request 변수가 false로 초기화되고 스레드 (아마도이 ​​정보가 도움이 될 것입니다 - idk)에서 true로 변경됩니다.

enter image description here

방법이 버그를 해결하기 위해?

DEBUG Command line - "/GS /analyze- /W3 /Zc:wchar_t /I"C:\boost_1_62_0" /ZI /Gm /Od /Fd"Debug\vc140.pdb" /Zc:inline /fp:precise /D "WIN32" /D "WIN32_LEAN_AND_MEAN_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MTd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\ExpenditureAndReceipts.pch""; 

RELEASE Command line - "/GS /analyze- /W3 /Gy /Zc:wchar_t /I"C:\boost_1_62_0" /Zi /Gm- /O2 /Fd"Release\vc140.pdb" /Zc:inline /fp:precise /D "WIN32" /D "WIN32_LEAN_AND_MEANNDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MT /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\ExpenditureAndReceipts.pch""; 
+3

루프가 아무 것도하지 않기 때문에 최적화 된 것 같습니다. – pm100

+1

변수'volatile'을 표시하여 컴파일러에게 최적화를 최적화하지 않도록 할 수 있습니다. –

+1

적절한 스레드 간 동기화를 사용해야합니다 (변수에 '휘발성'을 두지 않음). 원자 데이터 유형, 임계 섹션, 뮤텍스 또는 기타 적절한 것을 사용하십시오. –

답변

-1

은 기본적으로 릴리스에만 버그는 당신을 도울 할 기계가 없다 제외하고는 정확히 다른 벌레처럼 달려 드는해야합니다. 응용 프로그램을 "Hello World"로 줄이십시오 - 약간의 출력을 제공하고 오류없이 종료하십시오. 그런 다음 전체 응용 프로그램을 다시 넣고 토글을 추가하여 버그없는 "Hello world"버전과 약간의 키 입력으로 도청 된 버전 사이를 전환 할 수 있습니다 ..

이제 Hello World 버전에 기능을 추가하고 (완전한 버전 유지) 버그가있는 지점을 격리하여 버그가없고, 약간 힘이 들어가며, 몇 번의 키 누름으로 버그가있는 버전을 전환 할 수 있습니다.

버그가있는 경우 종종 그 정보를 사용하여 진단 printf를 입력하십시오 (디버그 콘솔을 실행하여 stdout을 볼 수 있도록 실행하십시오).

제로 초기화 메모리를 해제하십시오. malloc()으로 할당되면 assert가 다르며 다른 많은 작은 변화가 있습니다. 물론 디버그 모드를 무의미하게 만드는 것은 물론, 릴리스 전용 버그를 갖는 것도 드문 일이 아닙니다.

+0

릴리스 전용 버그는 없으며 릴리스 모드에서 다르게 (더 심각하게) 나타나는 버그 만 있습니다. –

3

한 스레드에서 bool을 읽고 다른 스레드에 쓸 수는 없습니다. 컴파일러는 첫 번째 스레드에서 읽기를 캐시 할 수 있으며 메모리 변경 내용을 읽지 않습니다.

멀티 스레드 프로그래밍을 작성하는 경우, 원자 및 mutex 등을 통해 통신하십시오.

first_requeststd::atomic<bool>으로 바꿉니다. 다른 코드를 변경해야 할 수도 있습니다. 끝나면, 모든 것이 잘되어야합니다.

당신이 한 스레드에서 읽었거나, 다른 스레드에서 쓰거나, 동기화를 수행하지 않는 것은 정의되지 않은 동작입니다. 정의되지 않은 동작이 항상 중단되는 것은 아니며 때로는 릴리즈 빌드가 의미가 없기도합니다.

+0

첫 번째 진술에 대한 더 많은 정보를 얻기 위해 소스를 인용하거나 추천 할 수 있습니까? 분명히 내가 지금 수년 동안 잘못된 멀티 스레드 코드를 작성하고 그걸 읽고 싶습니다 ... –

+1

@JackWhite [This awesome SO post] (http://stackoverflow.com/a/6319356/1774667)는 C + +11 스레딩 모델. 기본적으로 C++ 03에서는 스레딩이 어떻게 작동하는지 정의하지 않습니다. C++ 11은 모델을 정의하고, 어떤 종류의 동기화가없는 읽기 및 쓰기 (뮤텍스가 아닌 여러 가지 방법이 동기화 될 수 있음)는 단순히 정의되지 않은 동작입니다. 마침표. 값이 한 스레드에서 캐시되고 메모리에서 다시 읽지 않는 경우가 있습니다. 글쎄요, 나는 그것이 일어난 것을 보았습니다. 그래서 그것은 SO 질문에서 다루어졌지만, 인용해야 할 것이 확실하지 않은 것을 보았습니다. – Yakk

관련 문제