멀티스레딩 프로그램이 최적화 모드에서 정지하지만 -O0에서는 정상적으로 실행됩니다.
이 문제는 공유 변수가 원자적이지 않은 멀티스레딩 프로그램에서 발생합니다. 특히 문제는 두 스레드가 동기화나 원자성 없이 액세스하는 부울 변수가 done에 있습니다.
최적화 모드에서 컴파일러는 여러 스레드가 액세스하는 공유 변수가 보호된다고 가정합니다. 그러나 이 프로그램에서는 done이 일반 bool로 선언되어 비원자적이게 됩니다. 이를 통해 컴파일러는 다중 스레드 작업에 필수적인 동기화 메커니즘을 최적화할 수 있습니다.
이 문제를 해결하려면 done을 std::atomic
고정 코드:
#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::cout << "\nmain thread>
라이브 데모: coliru
추가 고려 사항:
위 내용은 내 멀티스레드 프로그램이 최적화 모드에서는 정지하지만 -O0에서는 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!