교착 상태는 다른 스레드가 리소스를 해제할 때까지 스레드가 순환 대기 상태에 빠질 때 발생합니다. 교착 상태를 피하기 위한 전략은 다음과 같습니다. 루프 대기 방지 자원의 질서 있는 사용 시간 초과 전략 식사하는 철학자 문제에서 젓가락 자원의 질서 있는 사용(왼쪽 젓가락 먼저)은 교착 상태 문제를 해결합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!