C++ 多线程锁

#include “thread”
#include “mutex”
#include “iostream”

//! std::thread
//! jion 阻塞式, .join()后面的代码等待线程结束
//! detach 非阻塞式, 后面代码继续执行

1. mutex

类型说明
std::mutex最基本的 Mutex 类。
std::recursive_mutex递归 Mutex 类
std::time_mutex定时 Mutex 类
std::recursive_timed_mutex定时递归 Mutex 类。
std::mutex mtx;
int i = 0;
void add1()
{
    mtx.lock();
    for(int n = 0; n < 20; ++n)
        std::cout<<"add1 i = "<<++i<<std::endl;
    mtx.unlock();
}

void add2()
{
    mtx.lock();
    for(int n = 0; n < 20; ++n)
        std::cout<<"add2 i = "<<++i<<std::endl;
    mtx.unlock();
}

2. lock_guard

//! 创建即加锁,作用域结束自动析构并解锁,无需手工解锁
//! 不能中途解锁,必须等作用域结束才解锁
//! 不能复制

void add3()
{
    std::this_thread::sleep_for(std::chrono::milliseconds(10));
    std::lock_guard<std::mutex> lockg(mtx);
    for(int n = 0; n < 20; ++n){
        std::cout<<"add3 i = "<<++i<<std::endl;
    }
}

void add4()
{
    std::this_thread::sleep_for(std::chrono::milliseconds(10));
    std::lock_guard<std::mutex> lockg(mtx);
    for(int n = 0; n < 20; ++n){
        std::cout<<"add4 i = "<<++i<<std::endl;
    }
}

3. unique_lock 是 lock_guard 的升级加强版

//! 创建时可以不锁定(通过指定第二个参数为std::defer_lock),而在需要时再锁定
//! 可以随时加锁解锁
//! 作用域规则同 lock_grard,析构时自动释放锁
//! 不可复制,可移动
//! 条件变量需要该类型的锁作为参数(此时必须使用unique_lock)
//! std::adopt_lock (必须先加锁)
//! std::try_to_lock
//! std::defer_lock (必须手动加锁)

void add5()
{
    //! std::adopt_lock
    //mtx.lock();
    //std::unique_lock<std::mutex> ulock(mtx, std::adopt_lock);// 先加锁
    //! std::defer_lock
    //std::unique_lock<std::mutex> ulock(mtx, std::defer_lock);// 后手动加锁
    //ulock.lock();
    //!
    std::unique_lock<std::mutex> ulock(mtx);	//自动加锁
    for(int n = 0; n < 20; ++n)
        std::cout<<"add5 i = "<<++i<<std::endl;
}

void add6()
{
    //! std::adopt_lock
    //mtx.lock();
    //std::unique_lock<std::mutex> ulock(mtx, std::adopt_lock);
    //! std::defer_lock
    //std::unique_lock<std::mutex> ulock(mtx, std::defer_lock);
    //ulock.lock();
    //!
    std::unique_lock<std::mutex> ulock(mtx);
    for(int n = 0; n < 20; ++n)
        std::cout<<"add6 i = "<<++i<<std::endl;
}

4. condition_variable

std::condition_variable cv;
bool wait = false;
void printf1(int n)
{
    for (int i = 0; i < n; ++i) {
        std::unique_lock<std::mutex> ulock(mtx);
        if(wait) cv.wait(ulock);
        std::cout<<"printf1    " << i <<std::endl;
        wait = true;
        cv.notify_one();
    }
}

void printf2(int n)
{
    for (int i = 0; i < n; ++i) {
        std::unique_lock<std::mutex> ulock(mtx);
        if(!wait) cv.wait(ulock);
        std::cout<<"printf2    " << i+10 <<std::endl;
        wait = false;
        cv.notify_one();
    }
}

5. 调用

//! 1.mutex
    std::thread td(add1);
    std::thread td2(add2);
    td.join();
    td2.join();
//! 2. lock_guard
    std::thread td3(add3);
    std::thread td4(add4);
    td3.detach();
    td4.detach();
//! 3. unique_lock
std::thread td5(add5);
std::thread td6(add6);
td5.detach();
td6.detach();
//! 4. condition_variable + unique_lock
std::thread td7(printf1, 10);
std::thread td8(printf2, 10);
td7.detach();
td8.detach();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值