unique_lock

一种可以推迟加锁的模版类。

#include <iostream>
#include <mutex>
#include <thread>

using namespace std;

struct Box
{
    explicit Box(int num) : num_things{num} {}
 
    int num_things;
    std::mutex m;
};

void transfer(Box& from, Box& to, int num)
{
    unique_lock<mutex> lock1{from.m,defer_lock};
    unique_lock<mutex> lock2{to.m,defer_lock};
    lock(lock1,lock2);

    from.num_things-=num;
    to.num_things+=num;

    // // don't actually take the locks yet
    // std::unique_lock lock1{from.m, std::defer_lock};
    // std::unique_lock lock2{to.m, std::defer_lock};
 
    // // lock both unique_locks without deadlock
    // std::lock(lock1, lock2);
 
    // from.num_things -= num;
    // to.num_things += num;
 
    // 'from.m' and 'to.m' mutexes unlocked in 'unique_lock' dtors
}

int main()
{
    std::cout << "C++ Standard Version: " << __cplusplus << std::endl;
    Box acc1{100};
    Box acc2{200};

    thread t1{
        transfer,ref(acc1),ref(acc2),10
    };

    thread t2{
        transfer,ref(acc1),ref(acc2),2
    };
    t1.join();
    t2.join();
    
    std::cout << "acc1: " << acc1.num_things << "\n"
                 "acc2: " << acc2.num_things << '\n';
    // Box acc1{100};
    // Box acc2{50};
 
    // std::thread t1{transfer, std::ref(acc1), std::ref(acc2), 10};
    // std::thread t2{transfer, std::ref(acc2), std::ref(acc1), 5};
 
    // t1.join();
    // t2.join();
 
    // std::cout << "acc1: " << acc1.num_things << "\n"
    //              "acc2: " << acc2.num_things << '\n';
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值