一些常用的 std 类型

std::allocator

标准库中包含一个名为allocator的类,允许我们将分配和初始化分离。使用allocator通常会提供更好的性能和更灵活的内存管理能力。

标准库allocator类定义在头文件memory中,它帮助我们将内存分配和对象构造分离开来。它提供一种类型感知的内存分配方法,它分配的内存是原始的、未构造的。

allocator支持的操作,如下:

一些常用的 std 类型

下面是一段标准用法:

int test_allocator_1()
{
    std::allocatorstring> alloc; // 可以分配string的allocator对象
    int n{ 5 };
    auto const p = alloc.allocate(n); // 分配n个未初始化的string

    auto q = p; // q指向最后构造的元素之后的位置
    alloc.construct(q++); // *q为空字符串
    alloc.construct(q++, 10, 'c'); // *q为cccccccccc
    alloc.construct(q++, "hi"); // *q为hi

    std::cout << *p << std::endl; // 正确:使用string的输出运算符
    //std::cout << *q << std::endl; // 灾难:q指向未构造的内存
    std::cout << p[0] << std::endl;
    std::cout << p[1] << std::endl;
    std::cout << p[2] << std::endl;

    while (q != p) {
        alloc.destroy(--q); // 释放我们真正构造的string
    }

    alloc.deallocate(p, n);

    return 0;
}

参考:

1、https://blog.csdn.net/fengbingchun/article/details/78943527

std::recursive_mutex

定义于头文件

class recursive_mutex;  // C++11 起

recursive_mutex 类是同步原语,能用于保护共享数据免受从个多线程同时访问。

recursive_mutex 提供排他性递归所有权语义:

  • 调用方线程在从它成功调用locktry_lock 开始的时期里 占有 recursive_mutex 。此时期间,线程可以进行对locktry_lock 的附加调用。所有权的时期在线程调用unlock 匹配次数时结束。
  • 线程占有 recursive_mutex 时,若其他所有线程试图要求 recursive_mutex 的所有权,则它们将阻塞(对于调用lock )或收到false 返回值(对于调用 try_lock )。
  • 可锁定 recursive_mutex 次数的最大值是未指定的,但抵达该数后,对lock 的调用将抛出std::system_error 而对 try_lock 的调用将返回 false 。

recursive_mutex 在仍为某线程占有时被销毁,则程序行为未定义。 recursive_mutex 类满足互斥 (Mutex) 和标准布局类型(StandardLayoutType) 的所有要求。

一些常用的 std 类型

参考:

1、https://zh.cppreference.com/w/cpp/thread/recursive_mutex

std::condition_variable

#include     // std::condition_variable

std::mutex mtx; // 全局互斥锁.

std::condition_variable cv; // 全局条件变量.

bool ready = false; // 全局标志位.

void do_print_id(int id)
{
    std::unique_lock  lck(mtx);
    while (!ready) // 如果标志位不为 true, 则等待...

        cv.wait(lck); // 当前线程被阻塞, 当全局标志位变为 true 之后,
    // 线程被唤醒, 继续往下执行打印线程编号id.

    std::cout << "thread " << id << '\n';
}

void go()
{
    std::unique_lock  lck(mtx);
    ready = true; // 设置全局标志位为 true.

    cv.notify_all(); // 唤醒所有线程.

}

int main()
{
    std::thread threads[10];
    // spawn 10 threads:
    for (int i = 0; i < 10; ++i)
        threads[i] = std::thread(do_print_id, i);

    std::cout << "10 threads ready to race...\n";
    go(); // go!

  for (auto & th:threads)
        th.join();

    return 0;
}

一些常用的 std 类型

第一种情况下,在线程被阻塞时,该函数会自动调用 lck.unlock() &#x91CA;&#x653E;&#x9501;&#xFF0C;&#x4F7F;&#x5F97;&#x5176;&#x4ED6;&#x88AB;&#x963B;&#x585E;&#x5728;&#x9501;&#x7ADE;&#x4E89;&#x4E0A;&#x7684;&#x7EBF;&#x7A0B;&#x5F97;&#x4EE5;&#x7EE7;&#x7EED;&#x6267;&#x884C;&#x3002;另外,一旦当前线程获得通知(notified,通常是另外某个线程调用 notify_* 唤醒了当前线程),wait() 函数也是自动调用 lck.lock(),使得 lck 的状态和 wait 函数被调用时相同。

在第二种情况下(即设置了 Predicate),pred 相当于资源数量。只有当 pred 条件为 false 时调用 wait() 才会阻塞当前线程,并且在收到其他线程的通知后只有当 pred 为 true 时才会被解除阻塞。

#include     // std::condition_variable

std::mutex mtx;
std::condition_variable cv;

int cargo = 0;
bool shipment_available()
{
    return cargo != 0;
}

// 消费者线程.

void consume(int n)
{
    for (int i = 0; i < n; ++i) {
        std::unique_lock  lck(mtx);
        cv.wait(lck, shipment_available);
        std::cout << cargo << '\n';
        cargo = 0;
    }
}

int main()
{
    std::thread consumer_thread(consume, 10); // 消费者线程.

    // 主线程为生产者线程, 生产 10 个物品.

    for (int i = 0; i < 10; ++i) {
        while (shipment_available())
            std::this_thread::yield();
        std::unique_lock  lck(mtx);
        cargo = i + 1;
        cv.notify_one();
    }

    consumer_thread.join();

    return 0;
}

std::condition_variable_any 介绍

与 std::condition_variable 类似,只不过 std::condition_variable_any 的 wait 函数可以接受任何 lockable 参数,而 std::condition_variable 只能接受 std::unique_lock

参考:

1、https://www.cnblogs.com/haippy/p/3252041.html

Original: https://www.cnblogs.com/tekkaman/p/10313882.html
Author: Tekkaman
Title: 一些常用的 std 类型

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/549340/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Android Jetpack Navigation基本使用

    Android Jetpack Navigation基本使用 本篇主要介绍一下 Android Jetpack 组件 Navigation 导航组件的 基本使用 当看到 Navig…

    技术杂谈 2023年7月10日
    087
  • Microk8s 安装 与使用指南

    我们已经知道,Kubernetes 是基于容器的应用程序的首选编排平台,可以自动部署和扩展这些应用程序,并简化维护操作。但是,Kubernetes也有其自身的复杂性挑战。那么,企业…

    技术杂谈 2023年5月30日
    0102
  • [转载]ThinkPHP漏洞分析与利用

    一、组件介绍 1.1 基本信息 ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,遵循Apache 2开源协议发布,使用面向对象的开发结构和MVC模式,融合了St…

    技术杂谈 2023年5月30日
    072
  • crudapi增删改查接口零代码产品成功案例之商会联盟卡项目

    crudapi增删改查接口零代码产品成功案例之商会联盟卡项目 简介 商会联盟卡项目主要通过免费领取会员卡的方式吸引会员去合作商家线下消费,通过会员卡买单可以享受打折福利,最终顾客得…

    技术杂谈 2023年7月24日
    062
  • 6、Swift协程详解:属性隔离和Actor

    Task 的取消就是个状态 Task 的取消其实非常简单,就是将 Task 标记为取消状态。那 Task 的执行体要怎么做才能让任务真正取消呢?我们先看个简单的例子: 我们创建了一…

    技术杂谈 2023年6月1日
    061
  • OpenSSL命令—pkcs12

    用途: pkcs12文件工具,能生成和分析pkcs12文件。PKCS#12文件可以被用于多个项目,例如包含Netscape、MSIE和MS Outlook。 用法: openssl…

    技术杂谈 2023年5月31日
    089
  • WEBGIS开发 Cesium中3DTiles的加载策略 LOD多层次细节 最大屏幕空间误差解析[转]

    3DTiles加载策略:3DTiles数据格式能够支持海量数据渲染的重要因素之一就是其提供了LOD能力,LOD(Levels of Detail)意译为多层次细节技术,它最重要的作…

    技术杂谈 2023年5月31日
    089
  • dns ping

    :: :: Posted on2022-05-22 19:00 季枫 阅读(12 ) 评论() 编辑 https://tool.chinaz.com/dns/?type=1&amp…

    技术杂谈 2023年5月30日
    078
  • Ctrl-s Ctrl-q 停滞terminal滚动信息与放开

    特性为Software Flow Control (XON/XOFF flow control) 当要给数据连接终端无法接受更多数据时,会发送XOFF来暂停,发送XON来继续接收。…

    技术杂谈 2023年6月1日
    099
  • 跨域

    同源策略指三个相同:协议相同、域名相同、端口相同,有一个不同即非同源。 主域与子域、域名与域名对应的IP。都是非同源的 同源策略可以算是web安全的基石,没有同源策略就么有安全可言…

    技术杂谈 2023年5月31日
    071
  • 3、Swift协程详解:调用协程

    我们现在已经知道怎么定义异步函数了,也可以很轻松的转换将现有的异步回调 API 转成异步函数。那下一个问题就是,既然普通函数不能调用异步函数,那定义好的这些异步函数该从哪儿开始调用…

    技术杂谈 2023年6月1日
    077
  • 使用6to5,让今天就来写ES6的模块化开发!

    http://es6rocks.com/2014/10/es6-modules-today-with-6to5/?utm_source=javascriptweekly&u…

    技术杂谈 2023年5月31日
    095
  • HIT软构博客6-设计模式

    设计模式可以分为1.创建型模式 2.结构型模式 3.行为类模式 1.创建型模式 ​ 工厂方法模式 ​ 当client不知道要创建哪个类的具体实例或不想在客户端代码指明要创建具体哪个…

    技术杂谈 2023年7月11日
    065
  • 在边缘计算场景中使用Dapr

    Dapr 是分布式应用程序可移植、事件驱动的运行时, 这里有几个关键字,我们拆开来看一下: 分布式: 代表共享或是分散,在云原生应用上体现为微服务,在边缘计算场景中代表分散的模块,…

    技术杂谈 2023年5月31日
    075
  • 一文带你快速拆解云智慧前端技术架构

    主讲人:王海虎,云智慧/智能研究院/算法工程经理讲师简介:6年开发经验,主攻可视化方向、3d引擎、视野分析方向。18年开始做可视化方向,从前端工程师做到开发经理;开源项目FlyFi…

    技术杂谈 2023年7月23日
    060
  • spring-MVC

    步骤 1.创建maven父项目 导入公共依赖 junit junit 4.12 org.springframework spring-webmvc 5.1.9.RELEASE ja…

    技术杂谈 2023年7月11日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球