C++11一些知识点

这篇具有很好参考价值的文章主要介绍了C++11一些知识点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、C++11实现生产者与消费者模型

#include <mutex>
#include <condition_variable>
#include <queue> //C++ STL里面的所有容器都不是线程安全的
#include <iostream>
#include <thread>

using namespace std;

class Queue
{
public:
    void put(int val) // 生产者
    {
        unique_lock<std::mutex> lck(mtx);
        while (!que.empty())
        {
            // que不为空,生产者应该通知消费者去消费
            // 生产者应该进入 #1等待状态 #2并把mtx互斥锁释放掉
            cv.wait(lck);
        }
        que.push(val);
        cv.notify_all(); // 通知其他所有消费者可以进行消费了
        //其他线程的得到通知就会从等待状态 ==> 阻塞状态 ==> 获取互斥锁才能继续执行

        cout << "生产者生产:" << val << "号物品" << endl;
    }

    int get() // 消费者
    {
        unique_lock<std::mutex> lck(mtx);
        while (que.empty())
        {
            // 消费者线程发现que是空的,通知生产者线程生产物品
            // #1 进入等待状态 #2把互斥锁mutex释放掉
            cv.wait(lck);
        }
        int val = que.front();
        que.pop();
        cv.notify_all(); //通知其他所有生产者可以进行生产了
        cout << "消费者消费: " << val << "号物品" << endl;
        return val;
    }

private:
    queue<int> que;
    mutex mtx;             // 定义互斥锁,做线程间的胡吃操作
    condition_variable cv; // 定义条件变量,做线程之间的同步通信操作
};

void producer(Queue *que) // 生产者线程
{
    for (int i = 1; i <= 10; ++i)
    {
        que->put(i);
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

void consumer(Queue *que) // 消费者线程
{
    for (int i = 1; i <= 10; ++i)
    {
        que->get();
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

int main()
{
    Queue que; // 两个线程共享的队列
    thread t1(producer, &que);
    thread t2(consumer, &que);
    t1.join();
    t2.join();
}

2、unique_lock与lock_guard的比较

#include <bits/stdc++.h>
#include <mutex>
#include <condition_variable>

using namespace std;

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

int main()
{
    /***
     * 唤醒在cv上等待的线程
     * 其他在cv上等待的线程收到通知,从等待状态 ==> 阻塞状态 ==> 获得互斥锁 ==> 线程继续向下执行
     * **/
    // cv.notify_all();

    // 它不仅可以用在简单的临界区代码段的互斥操作中,还能用于函数调用过程中
    unique_lock<std::mutex> lck(mtx);
    cv.wait(lck); // #1使线程进入等待状态 #2 lck.unlock()可以把mutex释放掉

    // 不可以用在函数参数传递或者返回过程中,只能用在简单的临界区代码段的互斥操作中
    lock_guard<std::mutex> guard(mtx);

    // mtx.lock();
    // mtx.unlock();

    return 0;
}

引用自:施磊老师的《C++高级课程》文章来源地址https://www.toymoban.com/news/detail-518736.html

到了这里,关于C++11一些知识点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于BGP的一些知识点;(1)

    BGP路由属性中:     公认必遵属性有:Origin, AS_PATH,Next_hop      公认任意有:Local_Pref, Atomic_aggregate,        其中MED为可选非过渡不属于公认属性  Local-Preference是公认任意属性,且只能在一个AS内传播,默认值为100 BGP的Cluster_List 属性用来标识路由器反射组,是可选非过

    2024年02月07日
    浏览(39)
  • 一些关于c++的琐碎知识点

    目录 bool强转 const构成重载:const修饰*p  移动构造 new int (10)所做的四件事 this指针---为什么函数里面需要this指针? .和-的区别 new创建对象 仿函数 new和malloc的区别 c++系统自动给出的函数有 delete和delete[ ]区别何在 检查有没有析构函数 explict外部 内存泄漏的本质:丢失了内存地

    2024年02月07日
    浏览(38)
  • 关于set变更通知涉及的一些知识点

    在这个示例中,我们声明了一个私有字段  _name  作为存储名称的后端字段,并将其封装在公共属性  Name  中。在 setter 方法中,我们首先检查新值是否与旧值相同。如果不同,我们才更新存储字段,并调用  OnNameChanged()  方法来引发  NameChanged  事件。 注意, OnNameChanged  方

    2024年02月08日
    浏览(36)
  • 分享刷题的一些小知识点--4.9日

    1.string库提供了 、、==、=、=、!= 等比较运算符,比如两个字符串s和t,直接(s==t)是正确的。 2.unordered_map 容器,直译过来就是\\\"无序 map 容器\\\"的意思。所谓“无序”,指的是 unordered_map 容器不会像 map 容器那样对存储的数据进行排序。换句话说,unordered_map 容器和 map 容器仅有

    2023年04月11日
    浏览(34)
  • 使用es必须要知道的一些知识点:索引篇

    在当今数据驱动的世界中,Elasticsearch(简称ES)成为了一个强大而广泛应用的搜索和分析引擎。ES提供了快速、可扩展且高度可靠的数据存储和检索解决方案。然而,要真正掌握ES的各种功能和最佳实践,需要通过实践才能获得真正的知识。 在Elasticsearch(ES)中,index操作和

    2024年02月08日
    浏览(29)
  • 网络层中一些零碎且易忘的知识点

    异构网络:指传输介质、数据编码方式、链路控制协议以及数据单元格式和转发机制不同,异构即物理层和数据链路层均不同 虚电路:网络层可以向传输层提供两种类型的服务,面向连接的服务称为虚电路服务,而无连接的服务称为数据报服务。虚电路的想法是避免为发送的

    2024年02月15日
    浏览(29)
  • 数据结构中一些零碎且易忘的知识点

    第一章 绪论 数据结构包含三个方面的内容: 数据的逻辑结构:描述数据之间逻辑关系的、与数据的存储无关的数学模型。相同的逻辑结构可使用不同的存储结构存储,如线性表既可顺序存储,也可链式存储 线性结构:一个线性表是n个具有相同特性的数据元素的有限序列 一

    2024年02月14日
    浏览(30)
  • 传输层中一些零碎且易忘的知识点

    端口号:共两个字节 不同类型的端口号: 服务端端口号 熟知端口号:0~1023 登记端口号:1024~49151 客户端使用端口号(短暂/临时端口号):49152~65535 要记得常见应用程序的熟知端口号 FTP:21 TELNET:23 SMTP:25 DNS:53 TFTP:69 HTTP:80 SNMP:161 首部与伪首部: 伪首部中协议字

    2024年02月15日
    浏览(26)
  • 网络编程中关于UDP套接字的一些知识点

    关于UDP的介绍: UDP(User Datagram Protocol,用户数据报协议)是一种面向无连接的、不可靠的传输协议,它在网络编程中也起着重要的作用。 1. 低延迟:相比于TCP,UDP没有建立连接和拥塞控制的开销,因此传输延迟较低。这使得UDP适用于实时通信应用,如音视频传输和在线游戏

    2024年02月06日
    浏览(29)
  • 数据链路层中一些零碎且易忘的知识点

    差错控制 差错的种类: 位错(比特错):0变1、1变0(这类差错是本节所探讨的差错) 帧错:帧丢失、帧重复、帧失序(这类差错只在提供可靠传输的数据链路层中才进行修复) 要记的编码(数据链路层可使用只检测差错的编码,也可使用纠错编码) 检错编码: 奇偶校验码

    2024年02月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包