C++11多线程

一点笔记,后续展开。


thread给线程函数传参默认是值传递,如果需要引用传递,使用std::ref对参数取引用。或是使用std::move取右值引用,前提是参数传递后不会在原线程使用。

 

std::thread::hardware_concurrency()获取CPU个数,对设置线程数有很大的参考意义。

 

std::lock

使用死锁避免算法来Lock给定的Lockable的对象lock1,lock2,...,lockn,以防止死锁。

The objects are locked by an unspecifiedseries of calls to lock, try_lock, unlock. If a call to lock or unlock resultsin an exception, unlock is called for any locked objects before rethrowing.

std::lock(m_mutex1, m_mutex2);

std::lock_guard<std::mutex>locker1(m_mutex1, std::adopt_lock);

std::lock_guard<std::mutex>locker2(m_mutex2, std::adopt_lock);

// std::adopt_lock假定当前线程已经获得互斥对象的所有权,所以不再请求锁。

 

unique_lock比lock_guard更加灵活。

可以控制加锁的范围。

可以在构造函数中增加std::defer_lock参数(lock_guard不支持),表示先不请求锁。

可以多次加锁解锁。

lock_guard和unique_lock都不能复制,但unique_lock可以移动。

lock_guard性能要高些。

条件变量与锁共用,使用unique_lock,不能使用lock_guard,因为有重复的加解锁动作。

 

条件变量虚假唤醒(cond_signal或notify_one可能会唤醒多个等待线程),解决:pthread中使用while判断是否wait。C++11中在wait中增加判断条件。

 

异步编程

std::promise

std::future

std::shared_future

std::async

std::packaged_task


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值