21xrx.com
2024-09-20 00:03:50 Friday
登录
文章检索 我的文章 写文章
C++死锁简单实例
2023-07-05 09:42:17 深夜i     --     --
C++ 死锁 实例 简单 解决方法

C++是一门常用的编程语言,在实际开发中,我们常会遇到死锁问题。死锁是指两个或多个线程彼此卡住或者相互等待对方释放资源,最终都无法继续执行下去的情况。在C++编程中,死锁问题也是比较常见的。下面,我们来看一个简单的C++死锁实例。

假设我们有两个线程Thread1和Thread2,它们分别需要获取A锁和B锁才能执行下去。代码如下:


#include <iostream>

#include <thread>

#include <mutex>

std::mutex mtxA;  // A锁

std::mutex mtxB;  // B锁

void Thread1()

{

  // 获取A锁

  mtxA.lock();

  // 睡眠500毫秒,增加线程并发性

  std::this_thread::sleep_for(std::chrono::milliseconds(500));

  // 获取B锁

  mtxB.lock();

  // 执行线程1的逻辑操作

  std::cout << "Thread 1 Running..." << std::endl;

  // 释放锁

  mtxB.unlock();

  mtxA.unlock();

}

void Thread2()

{

  // 获取B锁

  mtxB.lock();

  // 睡眠500毫秒,增加线程并发性

  std::this_thread::sleep_for(std::chrono::milliseconds(500));

  // 获取A锁

  mtxA.lock();

  // 执行线程2的逻辑操作

  std::cout << "Thread 2 Running..." << std::endl;

  // 释放锁

  mtxA.unlock();

  mtxB.unlock();

}

int main()

{

  std::thread t1(Thread1);

  std::thread t2(Thread2);

  t1.join();

  t2.join();

  return 0;

}

在本例中,我们使用了两个互斥锁:mtxA和mtxB。Thread1首先获取A锁,然后睡眠500毫秒,模拟线程执行操作的时间。在这个过程中,Thread2也在获取B锁,然后同样睡眠500毫秒。这时,Thread1需要获取B锁才能继续执行,而Thread2需要获取A锁才能继续执行。但由于两个线程在等待对方释放锁,所以它们都无法继续执行下去,形成了死锁。

为了解决这个问题,我们可以优化代码逻辑,使得两个互斥锁按照相同的顺序获取和释放。即在Thread1中获取A锁,然后再获取B锁,在Thread2中也按照这个顺序获取和释放锁,即先获取B锁,再获取A锁。修改后的代码如下:


#include <iostream>

#include <thread>

#include <mutex>

std::mutex mtxA;  // A锁

std::mutex mtxB;  // B锁

void Thread1()

{

  // 获取A锁

  mtxA.lock();

  // 睡眠500毫秒,增加线程并发性

  std::this_thread::sleep_for(std::chrono::milliseconds(500));

  // 获取B锁

  mtxB.lock();

  // 执行线程1的逻辑操作

  std::cout << "Thread 1 Running..." << std::endl;

  // 释放锁

  mtxA.unlock();

  mtxB.unlock();

}

void Thread2()

{

  // 获取B锁

  mtxB.lock();

  // 睡眠500毫秒,增加线程并发性

  std::this_thread::sleep_for(std::chrono::milliseconds(500));

  // 获取A锁

  mtxA.lock();

  // 执行线程2的逻辑操作

  std::cout << "Thread 2 Running..." << std::endl;

  // 释放锁

  mtxB.unlock();

  mtxA.unlock();

}

int main()

{

  std::thread t1(Thread1);

  std::thread t2(Thread2);

  t1.join();

  t2.join();

  return 0;

}

在修改后的代码中,Thread1先获取A锁,再获取B锁,执行完逻辑操作后再先释放A锁,再释放B锁。Thread2按照相同的顺序获取和释放锁。这样,两个互斥锁都被按照相同的顺序获取和释放,就可以避免死锁问题。

总之,死锁问题是C++编程中常见的问题之一,需要我们注意和预防。在实际编程中,我们可以使用线程安全的容器和算法来避免死锁问题,或者按照相同的顺序获取和释放互斥锁,以实现代码逻辑的正确执行。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复