문제:
간단한 멀티스레딩 프로그램이 최적화 모드에서 컴파일될 때 예기치 않게 동작합니다. 프로그램이 디버그 모드 또는 -O0을 사용하여 정상적으로 실행되는 동안 -O1, -O2 또는 -O3을 사용하여 컴파일하면 중단됩니다.
해결책:
문제는 완성된 변수에 대한 비원자적 접근에 있습니다. 다중 스레드 환경에서 두 개의 스레드가 보호되지 않고 원자가 아닌 변수에 액세스하면 정의되지 않은 동작이 발생할 수 있습니다. 이 문제를 해결하려면 완성된 변수를 원자성으로 만들어야 합니다.
수정:
#include <iostream> #include <future> #include <atomic> static std::atomic<bool> finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result = std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished = true; std::cout << "result = " << result.get() << std::endl; std::cout << "\nmain thread>
설명:
By std::atomic
추가 참고 사항:
위 내용은 최적화로 컴파일할 때 다중 스레드 프로그램이 중단되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!