自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(10)
  • 收藏
  • 关注

原创 C++17 std::scoped_lock 实现

C++17 引入std::scoped_lock, 它是std::lock_guard的升级版本。scoped_lock可以一次绑定多个mutex,保证不会死锁,如果有多个mutex要同时lock,用scoped_lock。如果只要lock一个mutex,可以用lock_guard,不过更建议统一用升级过后的scoped_lock。类是提供便利机制的互斥包装器,它在作用域块的存在期间占有一或多个互斥体。当创建对象时,它尝试取得各给定互斥体的所有权。当控制离开创建对象的作用域时,析构并释放各互斥体。

2024-10-18 18:04:18 854

原创 C++ 线程池实现

在标头定义// 不予定义(1)(C++11 起)(2)(C++11 起)类模板包装任何可调用 (Callable)目标(函数、lambda 表达式、bind 表达式或其他函数对象),使得能异步调用它。其返回值或所抛异常被存储于能通过对象访问的共享状态中packaged_task是用来进行任务封装的,将任务封装起来的目的是为了进行线程之间的传递,进行任务的异步处理int add(int a, int b) { //两数之和。

2024-10-14 18:41:41 438

原创 C++ 读写锁 shared_mutex

(C++17 起)shared_mutex类是一个同步原语,可用于保护共享数据不被多个线程同时访问。与便于独占访问的其他互斥体类型不同,shared_mutex 拥有两个访问级别:共享- 多个线程能共享同一互斥体的所有权。独占- 仅一个线程能占有互斥。若一个线程已获取独占锁(通过locktry_lock),则无其他线程能获取该锁(包括共享的)。若一个线程已获取共享锁(通过),则无其他线程能获取独占锁,但可以获取共享锁。仅当任何线程均未获取独占锁时,共享。

2024-10-11 11:35:11 538

原创 C++ std::move 和 std::forward 实现

std::forward 仅仅对绑定到右值的引用实施向右值类型的强制类型转换,即仅当传入的实参被绑定到右值时候,std::forward才强制转化为右值。std::move 和 std::forward 都是仅仅执行强制类型转换的函数(底层为函数模板),2. std::forward的实现, 参考visual studio实现。3. remove_reference_t 实现如下。std::move 无条件的将实参强制转化为右值,1. std::move 的实现。

2024-10-09 17:43:05 248

原创 C++ 信号量

实现得比 std::counting_semaphore 的默认实现更高效。是 std::counting_semaphore 的特化的别名,其。LeastMaxValue = /* 由实现定义 */ >是一个轻量同步原语,能控制对共享资源的访问。在Visual studio是使用原子锁来实现的。C++20 新增了对于信号量的支持,具体参考。允许同一资源进行多个并发的访问,至少允许。现在使用锁和信号量手动实现一个信号量。

2024-10-09 11:57:01 702

原创 shared_ptr 实现

1. shared_ptr 的大小相当于裸指针的两倍,因为shared_ptr内部一般包含了一个指向该资源的裸指针,也包含一个指向该资源的引用计数的裸指针;shared_ptr是C++11 引入的新特性,用来管理内存,防止内存泄漏。3. 引用计数器的递增和递减必须是原子操作。2. 引用计数器的内存必须是动态分配的;shared_ptr 的简单实现。

2024-10-07 16:59:10 220

原创 C++11 类内初始化(In-Class Initialization)

3. 类内初始化成员变量,允许在定义类的时候,在类内直接对非静态成员,静态成员常量利用进行初始化(类内初始化是在定义类成员变量的时候直接对其赋值,赋值的方式可以使用等号赋值,也可以使用大括号赋值。可以发现编译器会把类内初始化的成员变量自动转换为初始化列表,在多个构造函数时,可以极大简化代码。初始化的顺序是先类内初始化,再初始化列表,最后构造函数初始化,后面的初始化会把前面的覆盖掉。1. 构造函数初始化 (C++11以前)2. 初始化列表 (C++11以前)不可以在类内初始化)。

2024-09-29 16:46:44 310

原创 C++17 if/switch 变量声明强化

C++17 引入了新特性,允许在if和switch语句内部定义并初始化变量,这样可以限制变量的作用域,避免在更广范围内的名称冲突。这种方式提高了代码的清晰度和安全性。

2024-09-27 16:56:22 278

原创 C++ lambda 底层实现

Lambda表达式主要是通过匿名类,重载operator() 运算符,至于捕获变量,无论是按值还是按引用捕获,都是作为类对象的成员变量。在调用lambda表达式处,构造类对象,通过调用operator()操作符来达到函数调用的效果。capture-list:捕获列表,用于指定在lambda函数体中可访问的外部变量。parameter-list:参数列表,类似于普通函数声明中的参数列表。{ body }:函数体,实现lambda表达式要执行的操作。对应的C++底层实现, 参考网址。

2024-09-27 16:09:32 859

原创 C++安全的比较不同类型的整数

较 ,-3(有符号) 变成 FFFF FFFD(十六进制),或者 4,294,967,293(无符号十进。即: if (static_cast(x) < y)原因x是有符号类型,y是有符号类型,标准化的行为是将有符号类型转换为无符号类型进行比。比较不同类型的整数,可能并不总是生成预期的结果。制),所以不小于 7。

2024-09-27 12:02:05 173

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除