C++多线程:创建多个线程与数据共享安全问题(四)

1、创建多个线程

多线程的调度由操作系统负责,线程执行的先后没有严格的顺序完全看操作系统和CPU的心情。

#include <iostream>
#include <vector>
#include <thread>

void thread_print(int num)
{
    std::cout << "线程编号 = " << num << ", 开始工作" << std::endl;
    std::cout << "-----线程编号 = " << num << ", 执行完毕-----" << std::endl;
    return ;
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    std::vector<std::thread> thread_vector;

    for(int i = 0;i < 10;i++){
        thread_vector.push_back(std::thread(thread_print, i));
    }
    for(auto it = thread_vector.begin();it != thread_vector.end();it++){
        it->join();
    }
    std::cout << "main thread executed finish!" << std::endl;
    return 0;
}

请添加图片描述

2、数据共享问题
  • 只读的数据:是安全稳定的,不需要特别的处理手段,直接大家都读就行。
  • 有读有写:2个线程写,8个线程读,由于任务切换可能会导致各种问题出现。此时就需要互斥,读的时候不能写,写的时候不能读。
  • 例如对一个queue容器:一个线程放数据一个线程取数据,如果两个线程不互斥那么将会导致错误访问。
#include <iostream>
#include <vector>
#include <thread>
#include <queue>


class MessageQueue{
public:
    void inMsgRecvQueue(){
        for(int i = 0;i < n;i++){
            std::cout << "inMsgRecvQueue()执行, 插入一个元素i = " << i << std::endl;
            q.push(i);
        }
    }

    void outMsgRecvQueue(){
        for(int i = 0;i < n;i++){
            if(q.size()){
                int msg = q.front();
                q.pop();
            }
            else{
                std::cout << "outMsgRecvQueue()执行, 但此时消息队列中为空" << std::endl;
            }
        }
    }
private:
    std::queue<int> q;
    static const int n = 100000;
};

int main() {
    MessageQueue messageQueue;
    std::thread in_thread(&MessageQueue::inMsgRecvQueue, std::ref(messageQueue));
    std::thread out_thread(&MessageQueue::outMsgRecvQueue, std::ref(messageQueue));
    in_thread.join();
    out_thread.join();
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/501303.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序UI设计规范,界面设计尺寸详解

作为互联网技术的重要组成部分&#xff0c;小程序在日常生活中发挥着越来越重要的作用。因此&#xff0c;了解和严格遵守小程序的 UI 设计标准非常重要&#xff0c;它不仅可以帮助我们在保证良好用户体验的同时优化小程序&#xff0c;还可以使我们的产品在竞争激烈的市场中占据…

Python 自学(九) 之异常处理,文件及目录操作

目录 1. try ... except ... else ... finally 排列 P231 2. write, read, seek, readline, readlines 基本文件操作 P245 3. os模块 基本目录操作 P249 4. os.path 模块 复杂目录操作 P250 5. os 模块 高…

什么是齐纳二极管?齐纳二极管1SMB5944BT3G参数详解+应用方案

关于齐纳二极管基本知识&#xff1a; 齐纳二极管&#xff0c;又称稳压二极管。利用PN结的反向击穿状态&#xff0c;电流变化范围大&#xff0c;电压基本不变。制作了具有稳压功能的二极管。这种二极管是一个高电阻半导体器件&#xff0c;直到临界反向击穿电压。在这个临界击穿…

numpy之linspace()函数使用详解

numpy之linspace()函数使用详解 linspace() 函数 作为序列生成器&#xff0c; numpy.linspace()函数用于在线性空间中以均匀步长生成数字序列。 Numpy通常可以使用numpy.arange()生成序列&#xff0c;但是当我们使用浮点参数时&#xff0c;可能会导致精度损失&#xff0c;这…

Linux(CentOS7)安装 MongoDB

目录 下载 上传 解压 创建mongodb.conf 创建数据文件夹和日志文件夹 启动服务 创建软链接 安装客户端 下载 上传 安装 下载 官方地址&#xff1a; Download MongoDB Community Server | MongoDBhttps://www.mongodb.com/try/download/community 上传 将下载好的 …

Pulsar 社区周报 | No.2024-03-29 Pulsar 全面拥抱 OpenTelemetry 标准

“ 各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar 社区周报更新啦&#xff01;这里将记录 Pulsar 社区每周的重要更新&#xff0c;周五发布。 ” Pulsar 逐步拥抱 OpenTelemetry 标准 OpenTelemetry 正在迅速成为指标度量的事实标准 API&#xff0c;这将有利于提升指标采集的扩…

羊大师解密长期喝羊奶的十大好处

在忙碌而又充满挑战的现代生活中&#xff0c;维持一个健康的生活方式变得越来越重要。羊奶&#xff0c;作为自古以来就被人类广泛消费的一种天然饮品&#xff0c;不仅味道醇厚&#xff0c;而且营养价值丰富。让我们一起探索长期饮用羊奶所带来的十大好处。 丰富的营养成分 羊奶…

Kaggle注册验证码问题(Captcha must be filled out.)

Kaggle注册验证码问题 Captcha must be filled out.使用Edge浏览器 Header Editor 插件安装 下载插件Header Editor 导入重定向脚本 点击扩展插件&#xff0c; 打开Header Editor插件&#xff0c;进行管理 点击导入输入下载链接进行下载或者导入本地json文件(二者任选其一…

你知道吗?NHANES数据也能做孟德尔随机化来验证因果,还发了二区(IF=7.4)

编者 近日&#xff0c;福建医科大学研究团队仅用孟德尔随机化&#xff0c;结合NHANES和GWAS数据库发文二区&#xff0c;验证他汀类药物是糖尿病视网膜病变的危险因素&#xff0c;与各位做个分享&#xff01; 相信大家都知道&#xff0c;高血糖会导致糖尿病&#xff08;DM&#…

安全团队需要重点演练的四大威胁

文章目录 前言一、勒索软件攻击二、第三方风险三、内部威胁四、分布式拒绝服务攻击(DDoS)前言 桌面演练(推演)是一种重要的安全演习形式,参演人员利用演练方案、流程图、计算机模拟、视频会议等辅助手段,针对事先假定的演练情景,讨论和推演应急决策及现场处置,从而促使相…

“51媒体”线下活动,媒体线上同步直播的好处,有哪些资源?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 线下活动媒体线上同步直播的好处以及可利用的资源如下&#xff1a; 好处&#xff1a; 扩大影响力&#xff1a;通过媒体线上同步直播&#xff0c;活动可以覆盖更广泛的受众群体&#xff…

37-巩固练习(一)

37-1 if语句等 1、问&#xff1a;输出结果 int main() {int i 0;for (i 0; i < 10; i){if (i 5){printf("%d\n", i);}return 0;} } 答&#xff1a;一直输出5&#xff0c;死循环 解析&#xff1a;i5是赋值语句&#xff0c;不是判断语句&#xff0c;每一次循…

零基础教程:R语言lavaan结构方程模型(SEM)

查看原文>>>最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;实践技术应用 基于R语言lavaan程序包&#xff0c;通过理论讲解和实际操作相结合的方式&#xff0c;由浅入深地系统介绍结构方程模型的建立、拟合、评估、筛选和结果展示的全过程。我们筛选大量…

鸿蒙原生应用开发-网络管理HTTP数据请求

一、场景介绍 应用通过HTTP发起一个数据请求&#xff0c;支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 二、接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 涉及的接口如下表&#xff0c;具体的…

分享一个免费的chat工具

用这个神奇的聊天工具&#xff0c;我的生活变得更加便利了。不需要魔法&#xff0c;不需要海外手机号码&#xff0c;来试试吧:Chat8。点击使用: https://guan.chat772.com/#/register?bronk_on1579566

用html写一个贪吃蛇游戏

<!DOCTYPE html> <html> <head><title>贪吃蛇</title><meta charset"UTF-8"><meta name"keywords" content"贪吃蛇"><meta name"Description" content"这是一个初学者用来学习的小…

实现一个Google身份验证代替短信验证

最近才知道公司还在做国外的业务&#xff0c;要实现一个登陆辅助验证系统。咱们国内是用手机短信做验证&#xff0c;当然 这个google身份验证只是一个辅助验证登陆方式。看一下演示 看到了嘛。 手机下载一个谷歌身份验证器就可以 。 谷歌身份验证器&#xff0c;我本身是一个基…

多模态大模型:解析未来智能汽车的新引擎

多模态大模型&#xff1a;解析未来智能汽车的新引擎 1. 多模态大模型简介2. 多模态大模型在智能汽车中的应用2.1 感知与认知2.2 智能驾驶辅助2.3 智能交互 随着人工智能技术的不断进步&#xff0c;智能汽车已经从概念变成了现实&#xff0c;成为了当今科技领域的焦点之一。而在…

#include<初见c语言之指针总结>

第一小节&#xff1a; #include&#xff1c;初见C语言之指针&#xff08;1&#xff09;&#xff1e;-CSDN博客 #add&#xff1c;初见C语言之指针&#xff08;1&#xff09;&#xff1e;-CSDN博客 第二小节&#xff1a; #include&#xff1c;初见c语言之指针…

C++进阶,手把手带你学继承

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 【本节目标】 1.继…