C++并发实战8:deadlock

本文探讨了C++并发编程中遇到的死锁问题及其解决方案。介绍了顺序加锁作为防止死锁的一种方法,以及避免死锁的四个策略:避免递归锁,不在持有锁时执行用户代码,确保加锁顺序,以及实施锁层次结构。通过这些策略,可以有效减少并发环境中的死锁风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         1 死锁:每个线程都希望锁住一些列锁以执行某个操作,且每个线程持有一个不同的锁,最终每个线程都需要其它线程的锁,导致所有线程都不能向前执行。


          1.1  顺序加锁lock

                1.1 死锁的一个解决方式:每个线程对锁的请求顺序一致。C++库提供了顺序加锁机制,可以一次性锁住多个mutex而不会出现死锁:

void lock (Mutex1& a, Mutex2& b, Mutexes&... cde);
           对a,b...cde锁顺序加锁,若在加锁过程中抛出任何异常就释放前面已持有的锁。不会出现死锁,一个例子如下:

#include <mutex>
#include<unistd.h>
#include<thread>
#include<iostream>
using namespace std;
class big_object
{
    public:
        big_object(int i=0):data(i){}
    public:
        int data;
};

void swap(big_object& lhs,big_object& rhs)
{
    sleep(1);
    cout<<"swap()"<<endl;
}
class X
{
    private:
        big_object some_detail;
        mutable std::mutex m;
    public:
        X(big_object const& sd):some_detail(sd){}

        friend void swap(X& lhs, X& rhs)
        {
            if(&lhs==&rhs)
                return;
            std::lock(lhs.m,rhs.m);//C++库会自动生成加锁顺序,即使调用顺序不一致
            std::lock_guard<std::mutex> lock_a(lhs.m,std::adopt_lock);//adopt_lock是告诉lock_guard对象mutex已经被上锁,而lock_gurad对象将获得mutex的所有权,这样就可以保证在lock可能出现异常导致没有unlock的情形不会出现,栈对象会在异常抛出后自动析构
            std:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值