当前位置: 首页 > news >正文

c++11多线程笔记

1 thread类
thread f;
线程等待join()
线程分离detach()

thread类不可拷贝复制

std::this_thread::yield();

 

2 bind 与lambda表达式

 

 

3 move
void some_function();
void some_other_function();
std::thread t1(some_function); // 1
std::thread t2=std::move(t1); // 2
t1=std::thread(some_other_function); // 3
std::thread t3; // 4
t3=std::move(t2); // 5
t1=std::move(t3); // 6 由于t1 已经与一个线程相关联, 赋值操作将使程序崩溃 。 必须显式地等待线程完成或者分离它


4 mutex
用法
std::mutex some_mutex;
some_mutex.lock()
some_mutex.unlock()


策略 tag type 描述
(默认) 无 请求锁,阻塞当前线程直到成功获得锁。
std::defer_lock std::defer_lock_t 不请求锁。
std::try_to_lock std::try_to_lock_t 尝试请求锁,但不阻塞线程,锁不可用时也会立即返回。
std::adopt_lock std::adopt_lock_t 假定当前线程已经获得互斥对象的所有权,所以不再请求锁。


策略 std::lock_guard std::unique_lock std::shared_lock
(默认) √ √ √(共享)
std::defer_lock × √ √
std::try_to_lock × √ √
std::adopt_lock √ √ √


//unique_lock 可防止死锁
std::mutex mt1, mt2;
// thread 1
{
std::unique_lock<std::mutex> lck1(mt1, std::defer_lock);
std::unique_lock<std::mutex> lck2(mt2, std::defer_lock);
std::lock(lck1, lck2);
// do something
}
// thread 2
{
std::unique_lock<std::mutex> lck1(mt1, std::defer_lock);
std::unique_lock<std::mutex> lck2(mt2, std::defer_lock);
std::lock(lck2, lck1);
// do something
}

配合std::condition_variable, 在wait时释放锁

 

//lock_guard 自动析构
std::lock_guard<std::mutex> guard(some_mutex);


5 atomic
内存模型
memory_order_release,memory_order_relaxed,memory_order_consume,memory_order_acquire,memoyr_order_acq_rel,memory_order_seq_cst(默认)

std::atomic_flag f = ATOMIC_FLAG_INIT; // 不能拷贝构造

std::atomic<bool> b(true); // 可以使用一个非原子类型赋值, 但不能拷贝构造


6
std::thread::hardware_concurrency()
std::async()


7 mutable
const 成员函数不能修改 类的成员 , 用mubable修饰之后可更改

转载于:https://www.cnblogs.com/myd620/p/10799177.html

相关文章:

  • 微软UWP应用,导航栏设计。
  • Python 之继承
  • 写给我即将出生小孩的第一封信
  • Centos6.5安装Redis3.2.8
  • SSH connect issue 'exec request failed on channel 0'
  • SQL0668N Operation not allowed for reason code 3 on table TEST. SQLSTATE=57016
  • 作用域插槽slot
  • nodejs模块
  • 智能制造主战场在哪?数字化车间建设尤为重要
  • 快速排序(java实现)
  • 十天冲刺(6)
  • HashMap和HashTable的区别?HashTable和ConCurrentHashMap的区别?
  • 小笔记by项目遇到(整理)
  • 2019年5月9日考试解题报告
  • 银联基于OpenStack 的“五高”生产金融云技术白皮书
  • “大数据应用场景”之隔壁老王(连载四)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 〔开发系列〕一次关于小程序开发的深度总结
  • C++11: atomic 头文件
  • create-react-app做的留言板
  • CSS 三角实现
  • DOM的那些事
  • golang 发送GET和POST示例
  • Java精华积累:初学者都应该搞懂的问题
  • JS实现简单的MVC模式开发小游戏
  • leetcode98. Validate Binary Search Tree
  • LintCode 31. partitionArray 数组划分
  • nodejs:开发并发布一个nodejs包
  • quasar-framework cnodejs社区
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SQL 难点解决:记录的引用
  • 包装类对象
  • 关于springcloud Gateway中的限流
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 配置 PM2 实现代码自动发布
  • 一个SAP顾问在美国的这些年
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​ArcGIS Pro 如何批量删除字段
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (+4)2.2UML建模图
  • (Note)C++中的继承方式
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)c52学习之旅-流水LED灯
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .net6 webapi log4net完整配置使用流程
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @RequestMapping 的作用是什么?
  • @SuppressLint(NewApi)和@TargetApi()的区别