>  기사  >  백엔드 개발  >  C++ 동시 프로그래밍의 교착상태와 교착상태를 피하기 위한 전략은 무엇입니까?

C++ 동시 프로그래밍의 교착상태와 교착상태를 피하기 위한 전략은 무엇입니까?

WBOY
WBOY원래의
2024-06-02 10:44:57706검색

교착 상태는 다른 스레드가 리소스를 해제할 때까지 스레드가 순환 대기 상태에 빠질 때 발생합니다. 교착 상태를 피하기 위한 전략은 다음과 같습니다. 루프 대기 방지 자원의 질서 있는 사용 시간 초과 전략 식사하는 철학자 문제에서 젓가락 자원의 질서 있는 사용(왼쪽 젓가락 먼저)은 교착 상태 문제를 해결합니다.

C++ 并发编程中死锁及避免死锁的策略?

C++ 동시 프로그래밍의 교착상태와 교착상태 방지 전략

교착상태란 무엇인가요?

동시 프로그래밍에서는 여러 스레드가 다른 스레드가 동시에 리소스를 해제할 때까지 기다릴 때 교착 상태가 발생합니다. 이로 인해 스레드가 무기한 차단되어 실행을 계속할 수 없습니다.

교착 상태를 피하기 위한 전략

교착 상태를 피하기 위한 몇 가지 전략이 있습니다:

  • 순환 대기 방지: 다른 스레드가 리소스를 해제할 때까지 기다리면서 스레드가 순환 대기 관계를 형성하지 않도록 합니다.
  • 자원의 질서있는 사용: 모든 자원에 대해 고정된 획득 순서를 설정하고 모든 스레드가 이 순서대로 자원을 획득하도록 강제합니다.
  • 타임아웃 전략: 리소스 획득에 대한 타임아웃을 설정합니다. 스레드가 타임아웃 기간 내에 리소스를 얻을 수 없으면 리소스가 해제됩니다.

실용 사례: 식사하는 철학자 문제

식사하는 철학자 문제는 전형적인 교착 상태 문제입니다. 둥근 탁자 주위에 5명의 철학자가 각각 젓가락을 들고 앉아 있습니다. 언제든지 왼쪽과 오른쪽에 있는 두 개의 젓가락으로 식사할 수 있지만 동시에 한 개의 젓가락만 사용할 수 있습니다. 모든 철학자가 동시에 왼쪽 젓가락을 집으면 모두 교착 상태에 빠지게 됩니다.

우리는 자원의 순서화된 사용전략을 사용하여 이 문제를 해결할 수 있습니다.

// 筷子类
class Chopstick {
public:
    Chopstick() {
        m_mutex = new std::mutex;
    }

    ~Chopstick() {
        delete m_mutex;
    }

    void lock() {
        m_mutex->lock();
    }

    void unlock() {
        m_mutex->unlock();
    }

private:
    std::mutex* m_mutex;
};

// 哲学家类
class Philosopher {
public:
    Philosopher(int id, Chopstick* left, Chopstick* right)
        : m_id(id), m_left(left), m_right(right) {}

    void dine() {
        while (true) {
            // 获取左边的筷子
            m_left->lock();

            // 获取右边的筷子
            m_right->lock();

            // 进餐
            std::cout << "哲学家 " << m_id << " 正在进餐" << std::endl;

            // 放下右边的筷子
            m_right->unlock();

            // 放下左边的筷子
            m_left->unlock();
        }
    }

private:
    int m_id;
    Chopstick* m_left;
    Chopstick* m_right;
};

int main() {
    // 创建 5 根筷子
    Chopstick chopsticks[5];

    // 创建 5 个哲学家
    Philosopher philosophers[5] = {
        Philosopher(0, &chopsticks[0], &chopsticks[4]),
        Philosopher(1, &chopsticks[1], &chopsticks[0]),
        Philosopher(2, &chopsticks[2], &chopsticks[1]),
        Philosopher(3, &chopsticks[3], &chopsticks[2]),
        Philosopher(4, &chopsticks[4], &chopsticks[3])
    };

    // 启动哲学家线程
    std::thread threads[5]; 
    for (int i = 0; i < 5; i++) {
        threads[i] = std::thread(&Philosopher::dine, &philosophers[i]);
    }

    // 等待哲学家线程结束
    for (int i = 0; i < 5; i++) {
        threads[i].join();
    }

    return 0;
}

이 예에서는 각 젓가락에 대해 std::mutex뮤텍스를 만들어 한 번에 한 명의 철학자만 젓가락에 액세스할 수 있도록 합니다. 젓가락을 순서대로 정리하면 교착상태를 피할 수 있습니다.

위 내용은 C++ 동시 프로그래밍의 교착상태와 교착상태를 피하기 위한 전략은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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