学习时间及标题:

2022-4-16 c++ 杂记

学习内容:

1.锁/互斥量(mutex):

在c++等高级编程语言中,锁是用来提供访问保护的,且只在多线程编程时才有用。

Demo1—没有锁:

#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <chrono>
#include <stdexcept>int counter = 0;
void increase(int time) {for (int i = 0; i < time; i++) {// 当前线程休眠1毫秒std::this_thread::sleep_for(std::chrono::milliseconds(1));counter++;}
}int main(int argc, char** argv) {std::thread t1(increase, 10000);std::thread t2(increase, 10000);t1.join();t2.join();std::cout << "counter:" << counter << std::endl;return 0;
}

其结果为:

[root@2d129aac5cc5 demo]# ./mutex_demo1_no_mutex
counter:19997
[root@2d129aac5cc5 demo]# ./mutex_demo1_no_mutex
counter:19996

结果分析:自增操作"counter++"不是原子操作,而是由多条汇编指令完成的。多个线程对同一个变量进行读写操作就会出现不可预期的操作。以上面的demo1作为例子:假定counter当前值为10,线程1读取到了10,线程2也读取到了10,分别执行自增操作,线程1和线程2分别将自增的结果写回counter,不管写入的顺序如何,counter都会是11,但是线程1和线程2分别执行了一次自增操作,我们期望的结果是12。

Demo2—有锁

#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <chrono>
#include <stdexcept>int counter = 0;
std::mutex mtx; // 保护countervoid increase(int time) {for (int i = 0; i < time; i++) {mtx.lock();// 当前线程休眠1毫秒std::this_thread::sleep_for(std::chrono::milliseconds(1));counter++;mtx.unlock();}
}int main(int argc, char** argv) {std::thread t1(increase, 10000);std::thread t2(increase, 10000);t1.join();t2.join();std::cout << "counter:" << counter << std::endl;return 0;
}

其结果为:

[root@2d129aac5cc5 demo]# ./mutex_demo2_with_mutex
counter:20000
[root@2d129aac5cc5 demo]# ./mutex_demo2_with_mutex
counter:20000
[root@2d129aac5cc5 demo]# ./mutex_demo2_with_mutex
counter:20000

总结:1. 对于std::mutex对象,任意时刻最多允许一个线程对其进行上锁
2. mtx.lock():调用该函数的线程尝试加锁。如果上锁不成功,即:其它线程已经上锁且未释放,则当前线程block。如果上锁成功,则执行后面的操作,操作完成后要调用mtx.unlock()释放锁,否则会导致死锁的产生
3. mtx.unlock():释放锁
4. std::mutex还有一个操作:mtx.try_lock(),字面意思就是:“尝试上锁”,与mtx.lock()的不同点在于:如果上锁不成功,当前线程不阻塞。

2.线程安全注解(GUARDED_BY):

作用:可以在代码编译阶段检查锁的使用情况。GUARDED_BY是数据成员的属性,声明数据成员受给定功能保护。对数据的读取操作需要共享访问,而写入操作需要独占访问。

Demo:

...
static ListenerList& listener_list GUARDED_BY(listener_list_mutex) = *new ListenerList();
...

分析:该 GUARDED_BY属性声明线程必须先锁定listener_list_mutex才能对其进行读写listener_list。

3.std::unique_ptr

std::unique_ptr 是 C++11 起引入的智能指针。

  • unique_ptr 不共享它的指针。它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL) 算法。只能移动unique_ptr。这意味着,内存资源所有权将转移到另一 unique_ptr,并且原始 unique_ptr 不再拥有此资源。我们建议你将对象限制为由一个所有者所有,因为多个所有权会使程序逻辑变得复杂。因此,当需要智能指针用于纯 C++ 对象时,可使用 unique_ptr,而当构造 unique_ptr 时,可使用make_unique 函数(c++14)。


Demo:

int main()
{// 创建一个unique_ptr实例unique_ptr<int> pInt(new int(5));cout << *pInt;
}

注:要想创建一个 unique_ptr,我们需要将一个new 操作符返回的指针传递给 unique_ptr 的构造函数。
std::make_unique 是 C++14 才有的特性。

4.unordered_map遍历

unordered_map 容器:unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。具体来讲,unordered_map 容器和 map 容器一样,以键值对(pair类型)的形式存储数据,存储的各个键值对的键互不相同且不允许被修改。但由于 unordered_map 容器底层采用的是哈希表存储结构,该结构本身不具有对数据的排序功能,所以此容器内部不会自行对存储的键值对进行排序。

值传递

for(auto [k,v]:map){cout<<k<<v<<endl;}

5. ::开头

::开头:表示顶级名称空间的意思,可帮助编译器找到被屏蔽的全局变量。
Demo:

#include <iostream>
int a = 1010;
int main ()
{int a = 66;std::cout << ::a << std::endl;return 0;
}

参考:


线程安全注解
GUARDED_BY
std::unique_ptr
unordered_map遍历
::开头

2022-4-16 c++ 杂记 mutex GUARDED_BY std::unique_ptr unordered_map ::开头相关推荐

  1. on java 8 学习笔记 2022.2.16

    2022.2.16 问题 其实我感觉引用计数的方法不只书中提到的这种问题吧,难道不会有对象被误删的情况吗? 答:不会,因为这种方法就是参考了只要有引用,它就是有效对象的路子,而只要引用大于0,那它就是 ...

  2. 【SRE笔记 2022.8.16 Linux命令基础01】

    [SRE笔记 2022.8.16] Xsell使用技巧补充 centos 7 root密码重置 方法一 方法二 numtui配置网络 Bash bash命令行图解 命令行提示符 控制变量 PS环境变量 ...

  3. 【不忘初心】 Windows11_22H2_22621.105_X64_可更新[纯净精简版][2.28G](2022.6.16)

    此版可正常更新补丁,关闭按流量计费,WIN11全新的UI界面出炉!可以说这一次Windows 11全新升级,无论是从Logo上还是UI界面设计,都有很大的变化,母版来自UUP WIN11_22621. ...

  4. _signature、X-Bogus、msToken生成【2022.12.16】全站通用X-Bogus

    本文以教学为基准.本文提供的可操作性不得用于任何商业用途和违法违规场景. 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任. 包含关注,点赞等 没露 ...

  5. 适合人工智能的编程语言有哪些 人工智能学习路线(2022.10.16)

    人工智能ai用什么编程语言_用于AI开发的6种最佳编程语言 人工智能ai用什么编程语言_用于AI开发的6种最佳编程语言_cxq8989的博客-CSDN博客 最适合人工智能开发的六种编程语言 最适合人工 ...

  6. 16.Oracle杂记——数据字典dba_tab_ privs

    16.Oracle杂记--数据字典dba_tab_ privs 视图dba_tab_grants是对象所授予的权限 sys@PDB1> desc dba_tab_privs Name       ...

  7. c++11 智能指针 (std::unique_ptr)(六)

    定义于头文件 <memory> template< class T, class Deleter = std::default_delete<T>>class un ...

  8. (译+原)std::shared_ptr及std::unique_ptr使用数组

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462363.html 参考网址: http://stackoverflow.com/questions ...

  9. 使用 std::shared_ptr 和 std::unique_ptr 测试 boost/pointer_cast.hpp

    使用 std::shared_ptr 和 std::unique_ptr 测试 boost/pointer_cast.hpp 实现功能 C++实现代码 实现功能 使用 std::shared_ptr ...

  10. std::make_shared<T>/std::make_unique<T>与std::shared_ptr<T>/std::unique_ptr<T>的区别与联系

    (1).std::make_shared<T>与std::make_unique<T>相对于std::shared_ptr<T>/std::unique_ptr&l ...

最新文章

  1. Blender中的Python脚本介绍学习教程
  2. PL/SQL数据库字符集问题
  3. ANDROID开发之SQLite详解
  4. scws sphinx mysql_Sphinx+Scws 搭建千万级准实时搜索应用场景详解
  5. javaweb 之javascript 结合
  6. np.random.randint产生一个范围内的数据
  7. 8张图带你轻松温习Java知识
  8. 软件测试用例项目写作,通用测试用例写作方法
  9. Python文件拷贝函数
  10. 生活之难:生活到底难在哪里
  11. “单口相声”回归!罗永浩要开发布会了:黑科技!不售票!
  12. 通过豆瓣Api,输入ISBN获取图书信息
  13. php redirect with post,试图理解Post / Redirect / Get设计模式(用PHP实...
  14. Hive thrift服务(将Hive作为一个服务器,其他机器可以作为客户端进行访问)
  15. Linux下修改PATH的方法
  16. 金园云化工园区智慧应急解决方案
  17. [论文导读]Restoring and attributing ancient texts using deep neural networks深度学习复原古希腊铭文
  18. 五行代码实现图像识别(深入版)
  19. 以太网芯片W3100A到W3150A+的移植笔记(一)
  20. java 原型图_一张图搞懂原型、原型对象、原型链

热门文章

  1. easypanel php.ini,Linux下EasyPanel及PHP安装升级
  2. 在C ++中加载TORCHSCRIPT模型
  3. SqlServer的填充因子
  4. 字体图标转png透明图标——小程序开发用
  5. java计算机毕业设计交通规则考试系统源码+mysql数据库+系统+lw文档+部署
  6. 【学习笔记】矩阵分解Matrix Factorization及延伸阅读
  7. [luogu P5960] 【模板】差分约束算法
  8. 外媒称百度AI领跑全球,一场“战疫”告诉你为什么
  9. 无法定位程序输入点GetOverlappedResultEx 于动态链接库 KERNEL32.dll 上。
  10. php输出26个大小写英文字母