>백엔드 개발 >C++ >최적화로 컴파일할 때 다중 스레드 프로그램이 중단되는 이유는 무엇입니까?

최적화로 컴파일할 때 다중 스레드 프로그램이 중단되는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-19 08:24:56943검색

Why Does My Multithreaded Program Hang When Compiled with Optimization?

최적화 모드에서 멈춘 멀티스레딩 프로그램

문제:

간단한 멀티스레딩 프로그램이 최적화 모드에서 컴파일될 때 예기치 않게 동작합니다. 프로그램이 디버그 모드 또는 -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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.